Force перезагрузка из пользовательского действия в MSI в C#

StackOverflow https://stackoverflow.com/questions/1178327

Вопрос

Как мы можем попросить компьютера перезагрузку после установки из C# Custom Action?

Мы используем проект настройки VS 2005 для нашей настройки, и нам нужно программно решить, чтобы запросить для перезапуска (так что это не произойдет при каждой установке, только для некоторых).

Обновление: мы ищем что -то, что уже встроено в систему MSI Custom Action System. Если этого не существует, мы можем как -то прибегнуть к тому, чтобы как -то перезапустить ПК, но хотелось бы избежать этого.

ОБНОВЛЕНИЕ: Мы видим, где вы можете установить Reboot = Force При редактировании MSI в ORCA, можете ли вы изменить эти таблицы из пользовательского действия C# во время выполнения? Мы могли бы установить это для перезапуска каждый раз, но это может сделать нашу настройку раздражающей (ей нужно будет перезагрузить только в редких случаях).

Обновление: мы попробовали настройку:

savedState["REBOOT"] = "Force";

Из метода Install () нашего пользовательского действия, но не повезло. Это не похоже на идеал, SavedState действительно что -то делает.

Также попытался:

Context.Parameters["REBOOT"] = "Force";

Но я думаю, что эта коллекция - только аргументы командной строки, передаваемые на пользовательское действие.

Обновление: есть ли способ отредактировать нашу MSI с ORCA, чтобы заставить этот трюк работать? Может быть, запланировать перезагрузку на условие существующего файла? Мы не нашли, как установить свойства MSI из пользовательского действия C#.

Обновление: мы попытались зацепить Appdomain.processexit и appdomain.domainunload и запустить новый поток и вызов Process.getCurrentProcess (). Waitforexit (), и ни одно из этих событий не будет стрелять из C# Custom Action ...

Это было полезно?

Решение 2

Как кажется, единственный способ для нас решить это:

А) Изменить MSI с помощью ORCA, чтобы настройка перезагрузки для каждой установки

Б) повторить проект настройки WIX или установить Shield

Спасибо за помощь, ребята!

Другие советы

Вам нужно добавить или позвонить в MSI Custom Action PradeLeerBoot http://msdn.microsoft.com/en-us/library/aa371527(vs.85).aspx В вашем инсталлексексуаре. Вы можете сделать это, используя функцию MSI MSIDOAction, http://msdn.microsoft.com/en-us/library/aa370090(vs.85).aspx Внутри индивидуального действия. Обратите внимание, что пользовательское действие, которое планирует это, должно быть немедленным пользовательским действием, а не отложенным пользовательским действием. Это означает, что вам, вероятно, нужно будет запланировать его после установки. Вы также можете добавить его в InstallexeCuteSecence с условием публичного свойства, которое устанавливает ваши пользовательские действия.

Когда мне пришлось сделать это до того, как мы использовали функцию API Win32 от user32.dll, я думаю, что это было: Exitwindowsex ()

Lancesc дал вам ответ. Вам нужно запустить PradeLeerBoot, и лучший способ сделать это - вставить его в InstallexEcuteSecence, обусловленное вашим собственным собственным свойством, которое вы устанавливаете в своем пользовательском действии.

Как вы упоминаете, Wix - это путь к будущей гибкости. Теперь Wix также включает в себя DTF (Deployment Tools Foundation), который представляет собой богатый набор библиотек класса .NET, которые обертывают весь API Windows. Вы можете использовать это, чтобы легко получить доступ к базам данных MSI из C# или для написания пользовательских действий C#. Я могу предоставить больше информации об этом, если желательно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top