Domanda

Sto creando un provider WMI disaccoppiato in una libreria di classi. Tutto ciò che ho letto indica l'inclusione di qualcosa del genere:

[System.ComponentModel.RunInstaller(true)]
public class MyApplicationManagementInstaller : DefaultManagementInstaller { }

Lo scopo di questa installazione è perché l'infrastruttura WMI di Windows deve essere consapevole della struttura del mio provider WMI prima di essere utilizzata.

La mia domanda è: quando è questo " installer " corse? MSDN afferma che l'installer verrà richiamato "durante l'installazione di un assembly", ma non sono sicuro di cosa significhi o quando ciò accadrà nel contesto di una libreria di classi contenente un provider WMI.

Avevo l'impressione che si trattasse di una sostituzione automatica per l'esecuzione manuale di InstallUtil.exe contro l'assembly contenente il provider WMI, ma le modifiche apportate al provider non vengono riconosciute dall'infrastruttura WMI di Windows a meno che non esegua manualmente InstallUtil dal prompt dei comandi. Posso farlo sul mio computer durante lo sviluppo, ma se un'applicazione che utilizza il provider viene distribuita su altri computer, e allora?

Sembra che questa combinazione RunInstaller / DefaultManagementInstaller non funzioni correttamente, giusto?

È stato utile?

Soluzione

A quanto ho capito, DefaultManagementInstaller è gestito da installutil.exe - se non lo si include, la classe non è installata in WMI. Forse è possibile creare un "progetto di installazione" o "progetto di installazione" che lo esegue, ma non sono sicuro perché non uso Visual Studio.

[modifica]

per l'installazione remota, un'opzione potrebbe essere quella di utilizzare Installutil con l'opzione / MOF per generare MOF per l'assemblaggio e utilizzare mofcomp per spostarlo su WMI.

Altri suggerimenti

Uso qualcosa del genere per chiamare InstallUtil a livello di programmazione:

    public static void Run( Type type )
    {
        // Register WMI stuff
        var installArgs = new[]
                                   {
                                       string.Format( "//logfile={0}", @"c:\Temp\sample.InstallLog" ), "//LogToConsole=false", "//ShowCallStack",
                                       type.Assembly.Location,
                                   };

        ManagedInstallerClass.InstallHelper( installArgs );
    }

Chiamalo dal tuo metodo Main ().

-Dave

Grazie Uros. Sembra che tutto ciò che RunInstaller e DefaultManagementInstaller facciano in modo che tu possa eseguire InstallUtil correttamente contro l'assembly. Questo è strano perché sono quasi certo di non sapere di InstallUtil nel momento in cui avevo compilato e giocato con il mio primo provider WMI.

Cercherò di utilizzare il file MOF e per mio uso posso semplicemente eseguire la riga di comando InstallUtil come evento post build in VS.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top