WMIプロバイダーアセンブリのRunInstaller属性
質問
クラスライブラリに分離されたWMIプロバイダーを作成しています。これらの行に沿って何かを含めるために私が読んだすべてのポイント:
[System.ComponentModel.RunInstaller(true)]
public class MyApplicationManagementInstaller : DefaultManagementInstaller { }
このインストールの目的は、Windows WMIインフラストラクチャが使用される前にWMIプロバイダーの構造を認識する必要があるためです。
私の質問は-この「インストーラー」はいつですか?走った? MSDNでは、インストーラーは「アセンブリのインストール中」に呼び出されると述べていますが、それが何を意味するのか、WMIプロバイダーを含むクラスライブラリのコンテキストでいつ発生するのかはわかりません。
これは、WMIプロバイダーを含むアセンブリに対して InstallUtil.exe を手動で実行するための自動置換であるという印象を受けましたが、プロバイダーに加えた変更はWindows WMIインフラストラクチャで認識されませんコマンドプロンプトから手動でInstallUtilを実行しない限り。開発中に自分のマシンでこれを行うことができますが、プロバイダーを使用するアプリケーションが他のマシンにデプロイされている場合はどうなりますか?
このRunInstallerとDefaultManagementInstallerの組み合わせが正しく機能していないようです-正しいですか?
解決
おわかりのように、DefaultManagementInstallerはinstallutil.exeによって実行されます-これを含めないと、クラスはWMIにインストールされません。多分それを実行する「セットアッププロジェクト」または「インストーラープロジェクト」を作成することは可能かもしれませんが、Visual Studioを使用していないのでわかりません。
[編集]
リモートインストールの場合、オプションとしてInstallutilと/ MOFオプションを使用してアセンブリのMOFを生成し、mofcompを使用してWMIに移動することができます。
他のヒント
プログラムでInstallUtilを呼び出すには、次のようなものを使用します。
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 );
}
これをMain()メソッドから呼び出します。
-dave
Urosに感謝します。 RunInstallerとDefaultManagementInstallerでできることは、アセンブリに対してInstallUtilを正常に実行できるようにすることだけです。これは、最初のWMIプロバイダーでコンパイルしてプレイした時点でInstallUtilについて知らなかったことがほぼ確実だからです。
MOFファイルの使用を検討します。自分で使用する場合は、VSでビルド後イベントとしてInstallUtilコマンドラインを実行するだけです。