Атрибут RunInstaller в сборке поставщика WMI
Вопрос
Я создаю несвязанный поставщик WMI в библиотеке классов.Все, что я прочитал, указывает на включение чего-то в этом роде:
[System.ComponentModel.RunInstaller(true)]
public class MyApplicationManagementInstaller : DefaultManagementInstaller { }
Я полагаю, цель этой установки заключается в том, что инфраструктура Windows WMI должна быть осведомлена о структуре моего поставщика WMI до его использования.
Мой вопрос в том, когда запускается этот "установщик"?MSDN говорит, что установщик будет вызван "во время установки сборки", но я не уверен, что это означает и когда это произойдет в контексте библиотеки классов, содержащей поставщика WMI.
У меня сложилось впечатление, что это была автоматическая замена ручного запуска InstallUtil.exe против сборки, содержащей поставщика WMI, но изменения, которые я вношу в поставщика, не распознаются инфраструктурой 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().
-дэйв
Спасибо, Урос.Похоже, что все, что делают RunInstaller и DefaultManagementInstaller, - это позволяют вам успешно запустить InstallUtil для сборки.Это странно, потому что я почти уверен, что я не знал о InstallUtil в тот момент, когда я компилировал и играл со своим первым поставщиком WMI.
Я рассмотрю возможность использования файла MOF, и для собственного использования я могу просто запустить командную строку InstallUtil как событие post build в VS.