Registrazione dello schema per un'applicazione con strumentazione

È necessario che un'applicazione con strumentazione sia sottoposta a una fase di registrazione, in cui è possibile individuarne lo schema e registrarlo nel repository di WMI. La pubblicazione dello schema deve essere eseguita per ogni assembly. È necessario che per ogni assembly del quale vengono dichiarati i tipi di strumentazione (eventi o istanze) venga pubblicato lo schema in WMI. La pubblicazione viene eseguita tramite i meccanismi del programma di installazione standard in .NET Framework.

Innanzitutto, è necessario definire un programma di installazione per il progetto. Se il progetto non richiede un programma di installazione per altri scopi, è possibile utilizzare la classe predefinita di supporto per la gestione dell'installazione disponibile in System.Management.Instrumentation ed eseguire da questa le derivazioni nel codice:

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

In tal modo, si comunica al sistema l'esistenza di una fase di installazione per l'applicazione e che questa deve essere eseguita. Se il progetto deve passare attraverso altre fasi di installazione ed è già stato definito un programma di installazione del progetto, è necessario utilizzare la classe ManagementInstaller disponibile in System.Management.Instrumentation. È possibile, ad esempio, aggiungere il seguente codice al costruttore del programma di installazione del progetto:

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

È possibile chiamare questo passaggio di installazione in diversi modi:

  • Se si inserisce l'applicazione in un pacchetto di installazione di MSI, assicurarsi che l'opzione di esecuzione dei programmi di installazione di .NET sia attivata e il programma di installazione di MSI li eseguirà.

  • Eseguire l'utilità installutil.exe disponibile in .NET Framework SDK sull'assembly con strumentazione.

    c:> installutil <yourassemblyname>
    
  • Se si aggiunge la stringa seguente all'inizio della funzione Main(), è possibile eseguire il programma di installazione dall'interno dell'applicazione:

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

    Nota   Tuttavia, con questa opzione lo schema di gestione per l'applicazione sarà disponibile per i consumer solo dopo che l'applicazione è stata eseguita per la prima volta e non dal momento dell'installazione.

Indipendentemente dal modo scelto per chiamare la registrazione dello schema, questa avrà esito positivo solo se l'utente che la chiama è un membro del gruppo di amministratori locali. Generalmente, questo si verifica quando viene installata un'applicazione, ma si noti che, se non è necessario un passaggio di installazione per l'applicazione, sarà necessario che un amministratore locale la esegua almeno una volta prima che lo schema di gestione venga registrato e l'applicazione possa gestire dati ed eventi.

Per maggior praticità degli sviluppatori in fase di progettazione, lo schema sarà pubblicato automaticamente la prima volta che un'applicazione genera un evento o pubblica un'istanza. In questo modo si evita di dover dichiarare un programma di installazione di progetto e di dover eseguire InstallUtil durante la creazione rapida del prototipo di un'applicazione. Anche in questo caso la pubblicazione automatica dello schema viene eseguita solo se la persona che esegue l'applicazione è un membro del gruppo di amministratori locali. È importante notare che non è possibile fare affidamento su questo funzionamento quando l'applicazione è pronta per essere distribuita. Lo schema per un assembly con strumentazione deve essere pubblicato in WMI in fase di installazione, tramite uno dei meccanismi basati sui programmi di installazione precedentemente descritti.

Lo schema della classe di evento o di istanza risiede nell'assembly e viene registrato nel repository di WMI durante l'installazione.

Un assembly di .NET può contenere informazioni sulla versione. Non esiste mapping diretto tra la versione di assembly e lo schema di WMI registrato nel repository di WMI.

La procedura consigliata per evitare incompatibilità di versioni è la seguente:

  • In caso di modifiche dello schema, installare nuovamente l'assembly utilizzando installutil.exe.
  • Installare nuovamente gli assembly per tutte le eventuali classi derivate dalla classe modificata.
  • Compilare nuovamente le applicazioni client.

Tuttavia, esistono casi in cui non è possibile ricompilare le applicazioni client. I due scenari seguenti si riferiscono a questi casi. Entrambi si riferiscono a schemi di evento.

Scenario 1: lo schema della classe di evento non è cambiato.

Azione: quando si esegue la ricompilazione e la nuova installazione, assicurarsi che le versioni principale e secondaria dell'assembly che contengono la definizione di classe abbiano valori originali.

Scenario 2: lo schema della classe di evento è stato modificato. Più specificamente, lo schema della classe di evento è stato modificato con l'aggiunta di proprietà e/o metodi. Non sono stati rimossi né proprietà né metodi precedentemente definiti.

Azione: in questo caso si consiglia di spostare la strumentazione dell'applicazione in uno spazio dei nomi di WMI diverso.

Se lo schema correntemente registrato risulta per qualche ragione danneggiato, la riesecuzione di installutil.exe potrebbe non rilevare la necessità di registrare nuovamente lo schema originale. In questo caso, è possibile imporre la reinstallazione dello schema utilizzando l'opzione /f o /force:

installutil.exe /f <yourassemblyname>
 

Annullamento della registrazione di uno schema

In genere nei programmi di installazione è supportata un'opzione di disinstallazione, utilizzata nel seguente modo:

installutil.exe /u <yourassemblyname>

dove <yourassemblyname> è l'assembly contenente la definizione dello schema precedentemente registrato.

In questa versione, tuttavia, la classe ManagementInstaller non esegue alcuna operazione durante la disinstallazione, in particolare non annulla la registrazione dello schema. Questo comportamento è dovuto al fatto che lo stesso schema può essere utilizzato da più provider WMI e non viene utilizzato alcun meccanismo per verificare che un determinato schema non sia utilizzato da altre entità e possa essere rimosso in modo sicuro.

Vedere anche

Strumentazione di applicazioni .NET Framework tramite System.Management | Classi e mapping in CLI e WMI | Esposizione di eventi di gestione | Esposizione di dati di gestione | Ereditarietà