Класс управляемых событий WMI не является классом событий? - PullRequest
1 голос
/ 31 декабря 2010

Здесь я использую указания: http://msdn.microsoft.com/en-us/library/ms257351(VS.80).aspx для создания класса управляемых событий.Вот код, который я написал:

[ManagementEntity]
[InstrumentationClass(InstrumentationType.Event)]
public class MyEvent
{
    [ManagementKey]
    public string ID { get; set; }
    [ManagementEnumerator]
    static public IEnumerable<MyEvent> EnumerateInstances()
    {
        var e = new MyEvent() { ID = "9A3C1B7E-8F3E-4C54-8030-B0169DE922C6" };
        return new MyEvent[] { e };
    }
}

class Program
{
    static void Main(string[] args)
    {
        var thisAssembly = typeof(Program).Assembly;
        var wmi_installer = new AssemblyInstaller(thisAssembly, null);
        wmi_installer.Install(null);
        wmi_installer.Commit(null);

        InstrumentationManager.RegisterAssembly(thisAssembly);

        Console.Write("Press Enter...");
        Console.ReadLine();
        var e = new MyEvent() { ID = "A6144A9E-0667-415B-9903-220652AB7334" };
        Instrumentation.Fire(e);

        Console.Write("Press Enter...");
        Console.ReadLine();
        wmi_installer.Uninstall(null);
    }

}

Я могу запустить программу, и она правильно устанавливается.Используя wbemtest.exe, я могу просмотреть событие и «show mof»:

[dynamic: ToInstance, provider("WmiTest, 
      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")]
class MyEvent
{
    [read, key] string ID;
};

Обратите внимание, класс не наследуется от __ExtrinsicEvent, что странно ...

Я также могу запустить select * from MyEvent, и получить результат .Instrumentation.Fire() также не возвращает ошибок.Однако, когда я пытаюсь подписаться на событие, используя опцию «Уведомление» , я получаю 0x80041059

Номер: 0x80041059

Средство: WMI

Описание: Класс не является классом события.

Что я делаю не так, и существует ли правильный способ создания управляемого события WMI?

1 Ответ

1 голос
/ 05 января 2011

После некоторого копания я выяснил, что произошло: очевидно, в фреймворке 4 появилась вторая «ветвь» классов и атрибутов WMI, которая мешает классическим.Весь пример кода, который я нашел в Интернете, написан с учетом поддержки .NET 2.0 WMI.Я не нашел способа с классами .NET 4 унаследовать класс от __Event или __ExtrinsicEvent.

Было очень неприятно обнаружить, что Microsoft ввела две несовместимые ветви кода в одно и то же пространство имен, что не только нене работают друг с другом, но они нарушают функциональность друг друга.

В любом случае, чтобы решить проблему, мне нужно было убедиться, что мое приложение использует код .NET 2:

  • полностью избавился от DefaultManagementInstaller производного класса внутри сборки wmi.Используйте DefaultManagementProjectInstaller.
  • используйте Instrumentation.RegisterAssembly вместо InstrumentationManager.RegisterAssembly
  • и выполните некоторую ручную очистку пространства имен WMI на Uninstall(), так как классы wmi не удаляются из пространства имен должным образом с помощью.NET 2 api.
  • справляется с тем, что невозможно сделать поле [key] с .NET 2 api
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...