Freigeben über


Registrieren des Schemas für eine instrumentierte Anwendung

Eine instrumentierte Anwendung muss eine Registrierungsphase durchlaufen, in der ihr Schema erkannt und im WMI-Repository registriert wird. Die Schemaveröffentlichung muss pro Assembly erfolgen. Für jede Assembly, die Instrumentationstypen (Ereignisse oder Instanzen) deklariert, muss das Schema in WMI veröffentlicht werden. Dies wird mit dem Standardinstallationsmechanismus in .NET Framework erreicht.

Zunächst muss für das Projekt ein Installationsprogramm definiert werden. Wenn für das Projekt kein weiteres Installationsprogramm erforderlich ist, können Sie die in System.Management.Instrumentation bereitgestellte Hilfsklasse für das Standardverwaltungsinstallationsprogramm verwenden und im Code eine Ableitung von dieser erstellen:

[System.ComponentModel.RunInstaller(true)]
public class MyInstaller : DefaultManagementProjectInstaller {}

Dadurch wird dem System mitgeteilt, dass für die Anwendung ein Installationsschritt vorliegt, der ausgeführt werden soll. Wenn für das Projekt weitere Installationsschritte ausgeführt werden müssen und bereits ein Projektinstallationsprogramm definiert wurde, sollten Sie die in System.Management.Instrumentation bereitgestellte ManagementInstaller-Klasse verwenden. Sie würden beispielsweise folgenden Code zum Konstruktor des Projektinstallationsprogramms hinzufügen:

ManagementInstaller managementInstaller = new ManagementInstaller();
Installers.Add(managementInstaller);

Es gibt mehrere Möglichkeiten, diesen Installationsschritt aufzurufen:

  • Wenn die Anwendung in einem MSI-Installationspaket enthalten ist, muss die Option zum Ausführen von .NET-Installationsprogrammen aktiviert sein. Dann führt die MSI-Installation die Installationsprogramme für Sie aus.

  • Führen Sie das im .NET Framework SDK verfügbare Dienstprogramm installutil.exe für die instrumentierte Assembly aus.

    c:> installutil <yourassemblyname>
    
  • Sie können das Installationsprogramm über die Anwendung ausführen, indem Sie Folgendes am Anfang jeder Main()-Funktion hinzufügen:

        string[] installArgs = new String[] {
                                             "/logfile=",
                                             "/LogToConsole=false",
                                             "/ShowCallStack",
                                             typeof(App).Assembly.Location,
            };
            System.Configuration.Install.ManagedInstallerClass.InstallHelper(installArgs);
    

    Hinweis   Mit dieser Option steht das Verwaltungsschema für diese Anwendung dem Consumer erst nach dem erstmaligen Ausführen der Anwendung und nicht nach der Installation der Anwendung zur Verfügung.

Unabhängig davon, wie die Schemaregistrierung aufgerufen wird, ist die Registrierung nur dann erfolgreich, wenn es sich bei dem Aufrufer um ein Mitglied der Gruppe der lokalen Administratoren handelt. In der Regel ist dies der Fall, wenn eine Anwendung installiert wurde. Wenn Sie jedoch nicht möchten, dass ein Installationsschritt für die Anwendung erforderlich ist, muss dieser Schritt dennoch mindestens ein Mal von einem lokalen Administrator ausgeführt werden, damit das Verwaltungsschema registriert wird und die Anwendung Verwaltungsdaten und Ereignisse zur Verfügung stellen kann.

Um die Entwickler zur Entwurfszeit zu unterstützen, wird das Schema automatisch veröffentlicht, wenn die Anwendung erstmals ein Ereignis auslöst oder eine Instanz veröffentlicht. Dadurch ist das Deklarieren eines Projektinstallationsprogramms und das Ausführen von InstallUtil während der schnellen Erstellung eines Prototyps einer Anwendung nicht erforderlich. Auch hier erfolgt das automatische Veröffentlichen des Schemas nur dann, wenn es sich bei der Person, die die Anwendung ausführt, um ein Mitglied der Gruppe der lokalen Administratoren handelt. Sie dürfen sich auf dieses Verhalten nicht verlassen, wenn die Anwendung für die Weitergabe bereit ist. Das Schema für eine instrumentierte Assembly sollte bei der Installation mit Hilfe eines der weiter oben beschriebenen installationsbasierten Mechanismen in WMI veröffentlicht werden.

Das Klassenschema des Ereignisses (bzw. der Instanz) befindet sich in der Assembly und wird bei der Installation im WMI-Repository registriert.

Eine .NET-Assembly kann Versionsinformationen enthalten. Es besteht keine direkte Zuordnung zwischen der Assemblyversion und dem WMI-Schema, das im WMI-Repository registriert ist.

Es wird empfohlen, folgendermaßen vorzugehen, um Versionskonflikte zu vermeiden:

  • Wenn Änderungen am Schema vorgenommen wurden, installieren Sie die Assembly neu, indem Sie installutil.exe ausführen.
  • Installieren Sie die Assemblies für alle Klassen neu, die von der geänderten Klasse abgeleitet wurden (sofern zutreffend).
  • Kompilieren Sie die Clientanwendungen erneut.

Es gibt jedoch auch Fälle, in denen die Clientanwendungen nicht neu kompiliert werden können. In den beiden folgenden Szenarien wird dieses Problem demonstriert. Beide gelten für Ereignisschemas:

Szenario 1: Ereignisklassenschema wurde nicht geändert.

Aktion: Vergewissern Sie sich beim erneuten Kompilieren und Installieren, dass die Haupt- und die Nebenversion der Assembly mit der Klassendefinition die ursprünglichen Werte enthalten.

Szenario 2: Ereignisklassenschema wurde geändert. Das heißt, das Ereignisklassenschema wurde geändert, indem Eigenschaften und/oder Methoden hinzugefügt wurden. Es wurde keine der zuvor definierten Eigenschaften bzw. Methoden entfernt.

Aktion: In diesem Fall empfehlen wir dringlichst, die Anwendungsinstrumentation in einen anderen WMI-Namespace zu verschieben.

Wenn das derzeit registrierte Schema aus irgendeinem Grund beschädigt wird, erkennt installutil.exe in bestimmten Fällen bei einer erneuten Ausführung nicht, dass das ursprüngliche Schema erneut registriert werden muss. In diesem Fall kann eine erneute Installtion des Schemas durch den Installer mit dem Schalter /f oder /force erzwungen werden:

installutil.exe /f <yourassemblyname>
 

Aufheben der Schemaregistrierung

Im Allgemeinen unterstützen Installer einen Deinstallationsschalter, der üblicherweise wie folgt verwendet wird:

installutil.exe /u <yourassemblyname>

wobei <yourassemblyname> die Assembly mit der zuvor registrierten Schemadefinition ist.

Allerdings führt die ManagementInstaller-Klasse in dieser Version bei der Deinstallation keine Operationen durch, insbesondere werden keine Schemaregistrierungen aufgehoben. Der Grund dafür besteht darin, dass das gleiche Schema von mehreren WMI-Providern verwendet werden kann und kein Mechanismus vorhanden ist, der ermittelt, ob ein bestimmtes Schema von keiner weiteren Einheit verwendet wird und problemlos entfernt werden kann.

Siehe auch

Instrumentieren von .NET Framework-Anwendungen mit System.Management | Klassen und Zuordnung in CLI und WMI | Offenlegen von Verwaltungsereignissen | Verfügbarmachen von Verwaltungsdaten | Vererbung