托pipe的WMI事件类不是一个事件类?

我从这里使用方向: http : //msdn.microsoft.com/en-us/library/ms257351(VS.80).aspx创build一个托pipe的事件类。 这是我写的代码:

[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我可以浏览到事件,并“显示mof”:

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

请注意,该类不会从__ExtrinsicEventinheritance,这很奇怪…

我也可以select * from MyEvent运行select * from MyEvent ,并得到结果 。 Instrumentation.Fire()也不返回错误。 但是,当我试图订阅事件使用“通知查询” 选项 ,我得到0x80041059

号码:0x80041059

设施:WMI

说明:类不是事件类。

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

经过一番挖掘,我发现了什么事情:显然在框架4中,引入了WMI类和属性的第二个“分支”,这与经典的WMI类和属性干扰。 我在网上找到的所有示例代码都是用.NET 2.0 WMI支持来编写的。 我还没有找到一个方法与.NET 4类从__Event或__ExtrinsicEvent继承一个类。

发现微软将两个不兼容的代码分支引入到相同的命名空间中是非常烦人的,它不仅不能相互工作,而且会破坏对方的功能。

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

  • 完全摆脱WMI程序集内的DefaultManagementInstaller派生类。 使用DefaultManagementProjectInstaller
  • 使用Instrumentation.RegisterAssembly而不是InstrumentationManager.RegisterAssembly
  • Uninstall()上执行一些WMI名称空间的手动清理,因为wmi类没有从.NET 2 api的命名空间中正确地删除。
  • 应付这样一个事实,即使用.NET 2 api无法使字段成为[key]