WMI提供程序程序集中的RunInstaller属性
我在类库中创建一个解耦的WMI提供程序。我读过的所有内容都指向包括以下方面的内容:
[System.ComponentModel.RunInstaller(true)] public class MyApplicationManagementInstaller : DefaultManagementInstaller { }
我收集此安装的目的是因为Windows WMI基础结构在使用前需要了解WMI提供程序的结构。
我的问题是这个"安装程序"何时运行? MSDN说,安装程序将在"程序集安装期间"被调用,但是我不确定这是什么意思,或者在包含WMI提供程序的类库的上下文中何时发生。
我给人的印象是,这是对包含WMI提供程序的程序集上手动运行InstallUtil.exe的自动替代,但是除非我从命令提示符下手动运行InstallUtil,否则Windows WMI基础结构无法识别对提供程序所做的更改。我可以在开发过程中在自己的计算机上执行此操作,但是如果使用提供程序的应用程序已部署到其他计算机上,那该怎么办?
看来此RunInstaller / DefaultManagementInstaller组合无法正常工作吗?
解决方案
据我了解,如果我们不包含DefaultManagementInstaller,则由installutil.exe运行,该类未安装在WMI中。也许可以创建一个运行它的"安装项目"或者"安装程序项目",但是我不确定,因为我不使用Visual Studio。
[编辑]
对于远程安装,可以选择将Installutil与/ MOF选项一起使用,以为程序集生成MOF,并使用mofcomp将其移动到WMI。
谢谢Uros。看起来,RunInstaller和DefaultManagementInstaller所做的所有事情似乎都是使我们能够针对程序集成功运行InstallUtil。这很奇怪,因为我几乎可以肯定,在我与第一个WMI提供程序进行编译和使用时,我对InstallUtil还是一无所知。
我将使用MOF文件,对于我自己的使用,我可以在VS中将InstallUtil命令行作为生成后事件运行。
我使用类似这样的方式以编程方式调用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()方法中调用它。
-戴夫