2010-12-31 9 views
1

Ich verwende Anweisungen von hier: http://msdn.microsoft.com/en-us/library/ms257351(VS.80).aspx, um eine verwaltete Ereignisklasse zu erstellen. Hier ist der Code, den ich schrieb:Verwaltete WMI-Ereignisklasse ist keine Ereignisklasse?

[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); 
    } 

} 

Ich kann ein Programm ausführen, und es installiert ordnungsgemäß. Mit wbemtest.exe ich auf das Ereignis durchsuchen, und „Show mof“:

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

Hinweis, wird die Klasse erben nicht von __ExtrinsicEvent, das ist seltsam ...

ich auch select * from MyEvent laufen kann, und get the result. Instrumentation.Fire() gibt auch keinen Fehler zurück. Allerdings, wenn ich versuche zu Fall abonnieren mit "Benachrichtigung Query" option, ich bin immer 0x80041059

Nummer: 0x80041059

Einrichtung: WMI

Beschreibung: Klasse ist kein Ereignis Klasse.

Was mache ich falsch, und gibt es eine korrekte Möglichkeit, verwaltetes WMI-Ereignis zu erstellen?

Antwort

1

Nach etwas graben, habe ich herausgefunden, was passiert ist: anscheinend im Rahmen 4, es wurde ein zweiter "Zweig" von WMI-Klassen und -Attributen eingeführt, der mit den klassischen interferiert. Der gesamte Beispielcode, den ich im Internet gefunden habe, wurde mit Unterstützung für .NET 2.0 WMI geschrieben. Ich habe keinen Weg mit .NET 4-Klassen gefunden, um eine Klasse von __Event oder __ExtrinsicEvent zu erben.

Es war sehr ärgerlich zu finden, dass Microsoft zwei inkompatible Codezweige in den gleichen Namespace einführte, die nicht nur nicht miteinander funktionieren, sondern auch die Funktionalität gegenseitig stören.

Jedenfalls, was ich zu tun, um erforderlich war, das Problem zu beheben, im Wesentlichen sicherstellen, dass mein app .NET-2-Code verwendet:

  • vollständig innerhalb wmi Montag erhalten DefaultManagementInstaller abgeleiteten Klasse los. Verwenden Sie DefaultManagementProjectInstaller.
  • Verwendung Instrumentation.RegisterAssembly statt InstrumentationManager.RegisterAssembly
  • tut einige manuelle Bereinigung von WMI-Namensraum auf Uninstall(), da wmi Klassen richtig sind nicht aus dem Namespace mit .NET 2 api entfernt.
  • mit der Tatsache fertig werden, dass es unmöglich ist, ein Feld zu machen ein [key] mit .NET 2 api
zu sein