托管WMI事件类不是事件类?

时间:2010-12-31 16:51:15

标签: .net windows wmi managed

我正在使用此处的说明: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 MyEventget the resultInstrumentation.Fire()也不会返回任何错误。但是,当我尝试使用“通知查询”option订阅活动时,我收到0x80041059

  

编号:0x80041059

     

设施:WMI

     

描述:Class不是事件类。

我做错了什么,是否有正确的方法来创建托管WMI事件?

1 个答案:

答案 0 :(得分:1)

经过一番挖掘,我弄清楚发生了什么:显然在框架4中,引入了WMI类和属性的第二个“分支”,它干扰了经典类。我在互联网上找到的所有示例代码都是以.NET 2.0 WMI支持为基础编写的。我还没有找到使用.NET 4类从__Event或__ExtrinsicEvent继承类的方法。

发现微软在同一名称空间中引入了两个不兼容的代码分支是非常烦人的,这些分支不仅无法相互协作,而且会破坏彼此的功能。

无论如何,为了解决这个问题,我需要做的就是确保我的应用程序使用的是.NET 2代码:

  • 完全摆脱了wmi程序集中的DefaultManagementInstaller派生类。使用DefaultManagementProjectInstaller
  • 使用Instrumentation.RegisterAssembly代替InstrumentationManager.RegisterAssembly
  • Uninstall()上对WMI命名空间进行一些手动清理,因为没有使用.NET 2 api从命名空间中正确删除wmi类。
  • 应对这样一个事实:使用.NET 2 api不可能将字段设为[key]