Как стать автором
Обновить

Взаимодействие приложений посредством сервиса 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
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.