Взаимодействие приложений посредством сервиса Windows Management Instrumentation(WMI) в .NET
Ожидает приглашения
По работе с сервисом WMI написано не так много, а говорить про полноценное описание тех или иных механизмов работы WMI кажется излишним. В данном ревю предлагается рассмотреть, пожалуй, одну из самых актуальных на сегодняшний момент тем, а именно – взаимодействие приложений посредством WMI.
Для начала определим объекты работы. Это будут два приложения, одно из которых будет являться, условно, Хостингом, а второе, соответственно, Клиентом. Основная трудность состоит в том, чтобы реализовать и правильно «активировать» Хостинг-приложение.
Реализация Клиент-приложения требует следующих действий:
— в первую очередь добавление сборки System.Management.
— далее определим что конкретно будет осуществлять Клиент.
public class Client
{
public Client()
{
//создание подписчика на сообщения типа EventCallback
//root\Application – см. System.Management.Instrumentation.InstrumentedAttribute(объявлен
//в сборке Хостинга)
ManagementEventWatcher watcher = ManagementEventWatcher(@”root\Application”,
“Select * from EventCallback”);
//реализация подписки
watcher.EventArrived += new EventArrivedEventHandler(Watcher_EventArrived);
//начало прослушивания канала WMI
watcher.Start();
}
void Watcher_EventArrived(object sender, EventArrivedEventArgs e)
{
//Show e.NewEvent[“Value”];
//при получении сообщения – вызвать метод Хостинга
SendMessage();
}
void SendMessage()
{
// root/assoc — см. System.Management.Instrumentation.WmiConfigurationAttribute
//Host – класс на стороне Хостинга
managementClass processClass = new ManagementClass(“root/assoc”, “Host”, null);
//получение представления для данного типа
foreach(ManagementObject instance in processClass.GetInstances())
{
//обращение к методу типа
ManagementBaseObject inParams = instance.GetMethodParameters(“Func”);
inParams[“value”] = “Is trancend”;
//вызов метода на стороне Хостинга
instance.InvokeMethod(“Func”, inParams, new InvokeMethodOptions());
}
}
}
Можно сделать выводы что клиент не представляет собой сложно структурированного объекта и опирается на реализацию Хостинга. Тем не менее, необходимо отметить, что для работы с хостингом нужно владеть информацией о пространстве имен в котором зарегистрирован Хостинг («root/assoc»). Используя данный «идентификатор» можно получить полную информацию о реализации Хостинга (его методах, типе работы, свойствах). В свою очередь «root\Application» указывает на инструментарий, доступный для обращения к сборке Хостинга.
Перейдем к реализации Хостинга. Здесь процесс более трудоемкий и не столь однозначный. Во-первых, необходимо добавить сборки для работы с WMI и сконфигурировать сборку Хостинга:
using System:
Componentmodel;
Management;
Management.Instrumentation;
Configuration.Install;
[assembly: Instrumented (@”root\Application”)]
[assembly: WmiConfiguration (“root/assoc”, HostingModel = ManagementHostingModel.Decoupled)]
[System.ComponentModel.RunInstaller (true)]
Public class TheInstaller: DefaultManagementInstaller {}
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
//регистрация сборки
System.Configuration.Install.ManagedInstallerClass.InstallHelper(new String[]{ typeof (EventCallback).Assembly.Location});
//регистрация типа
InstrumentationManager.RegisterType(typeof(EventCallback));
EventCallback(“Sending msg”).Publish();
//waiting callback event
InstrumentationManager.UnregisterType(typeof(EventCallback));
System.Configuration.Install.ManagedInstallerClass.InstallHelper(new String[]{“/u”, typeof (EventCallback).Assembly.Location});
}
}
}
[ManagementEntity]
public class EventCallback: BaseEvent
{
[ManagementTask]
public void Func(string str)
{
//show message from Client-App
}
//ключ класса – наличие обязательно
[ManagementKey]
public String Value;
//наличие у класс параметра полностью идентичного одному ключу ОБЯЗАТЕЛЬНО
[ManagementBind]
private EventCallback(String Value)
{
this.Value = Value;
}
public static Publish(String str)
{
//push-уведомление
new EventCallback(str).Fire();
}
[ManagementEnumerator]
Static public IEnumerable EnumerateInstances()
{
return new EventCallback(“”);
}
}
Таким образом реализуется Хостинг. Необходимо обратить внимание на следующие особенности. Наличие обязательного атрибута [ManagementKey] без которого не произойдет установка сборки в пространство WMI. Данное поле или свойство должно обязательно инициализироваться и быть эквивалентным параметру, который принимает конструктор данного класса (эквивалентным значит: number=Number; т.е. совпадать по написанию и может быть регистронезависимым).
В результате получаем готовую связку Хостинг-Клиент в основе которой механизм передачи сообщений реализованный. Благодаря этому появляется возможность создания распределенных систем за механизм безопасности в которых сможет отвечать среда WMI, что дает определенную эффективность при разработке, поскольку исчезают проблемы авторизации и многие другими особенности работы с каналами связи.
1) msdn.microsoft.com/ru-ru/library/system.management.instrumentation.aspx
2) blogs.microsoft.co.il/blogs/sasha/archive/2008/04/30/wmi-provider-extensions-in-net-3-5-publishing-events-and-advanced-topics.aspx
Для начала определим объекты работы. Это будут два приложения, одно из которых будет являться, условно, Хостингом, а второе, соответственно, Клиентом. Основная трудность состоит в том, чтобы реализовать и правильно «активировать» Хостинг-приложение.
Клиент
Реализация Клиент-приложения требует следующих действий:
— в первую очередь добавление сборки System.Management.
— далее определим что конкретно будет осуществлять Клиент.
public class Client
{
public Client()
{
//создание подписчика на сообщения типа EventCallback
//root\Application – см. System.Management.Instrumentation.InstrumentedAttribute(объявлен
//в сборке Хостинга)
ManagementEventWatcher watcher = ManagementEventWatcher(@”root\Application”,
“Select * from EventCallback”);
//реализация подписки
watcher.EventArrived += new EventArrivedEventHandler(Watcher_EventArrived);
//начало прослушивания канала WMI
watcher.Start();
}
void Watcher_EventArrived(object sender, EventArrivedEventArgs e)
{
//Show e.NewEvent[“Value”];
//при получении сообщения – вызвать метод Хостинга
SendMessage();
}
void SendMessage()
{
// root/assoc — см. System.Management.Instrumentation.WmiConfigurationAttribute
//Host – класс на стороне Хостинга
managementClass processClass = new ManagementClass(“root/assoc”, “Host”, null);
//получение представления для данного типа
foreach(ManagementObject instance in processClass.GetInstances())
{
//обращение к методу типа
ManagementBaseObject inParams = instance.GetMethodParameters(“Func”);
inParams[“value”] = “Is trancend”;
//вызов метода на стороне Хостинга
instance.InvokeMethod(“Func”, inParams, new InvokeMethodOptions());
}
}
}
Можно сделать выводы что клиент не представляет собой сложно структурированного объекта и опирается на реализацию Хостинга. Тем не менее, необходимо отметить, что для работы с хостингом нужно владеть информацией о пространстве имен в котором зарегистрирован Хостинг («root/assoc»). Используя данный «идентификатор» можно получить полную информацию о реализации Хостинга (его методах, типе работы, свойствах). В свою очередь «root\Application» указывает на инструментарий, доступный для обращения к сборке Хостинга.
Хостинг
Перейдем к реализации Хостинга. Здесь процесс более трудоемкий и не столь однозначный. Во-первых, необходимо добавить сборки для работы с WMI и сконфигурировать сборку Хостинга:
using System:
Componentmodel;
Management;
Management.Instrumentation;
Configuration.Install;
[assembly: Instrumented (@”root\Application”)]
[assembly: WmiConfiguration (“root/assoc”, HostingModel = ManagementHostingModel.Decoupled)]
[System.ComponentModel.RunInstaller (true)]
Public class TheInstaller: DefaultManagementInstaller {}
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
//регистрация сборки
System.Configuration.Install.ManagedInstallerClass.InstallHelper(new String[]{ typeof (EventCallback).Assembly.Location});
//регистрация типа
InstrumentationManager.RegisterType(typeof(EventCallback));
EventCallback(“Sending msg”).Publish();
//waiting callback event
InstrumentationManager.UnregisterType(typeof(EventCallback));
System.Configuration.Install.ManagedInstallerClass.InstallHelper(new String[]{“/u”, typeof (EventCallback).Assembly.Location});
}
}
}
[ManagementEntity]
public class EventCallback: BaseEvent
{
[ManagementTask]
public void Func(string str)
{
//show message from Client-App
}
//ключ класса – наличие обязательно
[ManagementKey]
public String Value;
//наличие у класс параметра полностью идентичного одному ключу ОБЯЗАТЕЛЬНО
[ManagementBind]
private EventCallback(String Value)
{
this.Value = Value;
}
public static Publish(String str)
{
//push-уведомление
new EventCallback(str).Fire();
}
[ManagementEnumerator]
Static public IEnumerable EnumerateInstances()
{
return new EventCallback(“”);
}
}
Выводы
Таким образом реализуется Хостинг. Необходимо обратить внимание на следующие особенности. Наличие обязательного атрибута [ManagementKey] без которого не произойдет установка сборки в пространство WMI. Данное поле или свойство должно обязательно инициализироваться и быть эквивалентным параметру, который принимает конструктор данного класса (эквивалентным значит: number=Number; т.е. совпадать по написанию и может быть регистронезависимым).
В результате получаем готовую связку Хостинг-Клиент в основе которой механизм передачи сообщений реализованный. Благодаря этому появляется возможность создания распределенных систем за механизм безопасности в которых сможет отвечать среда WMI, что дает определенную эффективность при разработке, поскольку исчезают проблемы авторизации и многие другими особенности работы с каналами связи.
Источники
1) msdn.microsoft.com/ru-ru/library/system.management.instrumentation.aspx
2) blogs.microsoft.co.il/blogs/sasha/archive/2008/04/30/wmi-provider-extensions-in-net-3-5-publishing-events-and-advanced-topics.aspx