Как мы можем запросить перезагрузку компьютера после установки из пользовательского действия С#?
Мы используем проект установки VS 2005 для нашей установки, и нам необходимо программно решить запустить перезагрузку (так что это не произойдет при каждой установке, только на некоторых).
UPDATE: мы ищем то, что уже встроено в систему пользовательских действий MSI. Если этого не существует, мы можем как-то прибегнуть к перезапуску ПК, но хотелось бы избежать этого.
UPDATE: Мы видим, где вы можете установить REBOOT = Force при редактировании Msi в Orca, можете ли вы изменить эти таблицы из пользовательского действия С# во время выполнения? Мы могли бы установить это для перезапуска каждый раз, но это может привести к раздражению нашей установки (ее нужно будет только перезапустить в редких случаях).
ОБНОВЛЕНИЕ: Мы попытались установить:
savedState["REBOOT"] = "Force";
Из метода Install() нашего пользовательского действия, но не удачи. Это не похоже на IDictionary, saveState действительно что-то делает.
Также попытался:
Context.Parameters["REBOOT"] = "Force";
Но я думаю, что эта коллекция - это просто аргументы командной строки, переданные пользовательскому действию.
ОБНОВЛЕНИЕ: есть ли способ отредактировать нашу MSI с Orca, чтобы этот трюк работал? Может быть, запланировать перезагрузку при условии существования какого-либо файла? Мы не обнаружили, как установить свойства MSI из пользовательского действия С#.
UPDATE: мы попытались подключиться к AppDomain.ProcessExit и AppDomain.DomainUnload и начать новый поток и вызывать Process.GetCurrentProcess(). WaitForExit(), и ни одно из этих событий не будет срабатывать из пользовательского действия С#...
Как нам кажется, единственный способ разрешить это - либо:
A) Измените MSI с помощью orca, чтобы перезапустить установку для каждой установки
B) Повторите проект установки с помощью WiX или Install Shield
Спасибо за помощь ребятам.
Вам нужно добавить или вызвать пользовательское действие MSI ScheduleReboot http://msdn.microsoft.com/en-us/library/aa371527(VS.85).aspx в вашем InstallExecuteSequence. Вы можете сделать это, используя функцию MSI MsiDoAction, http://msdn.microsoft.com/en-us/library/aa370090(VS.85).aspx внутри настраиваемого действия. Обратите внимание, что настраиваемое действие, которое планирует это, должно быть немедленным пользовательским действием, а не отложенным пользовательским действием. Это означает, что вам, вероятно, придется запланировать его после InstallFinalize. Вы также можете добавить его в InstallExecuteSequence с условием публичного свойства, которое ваши настраиваемые наборы действий.
LanceSc дал вам ответ. Вам нужно запустить ScheduleReboot, и лучший способ сделать это - вставить его в InstallExecuteSequence, обусловленный вашим собственным пользовательским свойством, которое вы устанавливаете внутри своего пользовательского действия.
Как вы уже упоминали, Wix - это путь к будущей гибкости. Теперь Wix также включает DTF (Deployment Tools Foundation), который представляет собой богатый набор библиотек .NET-классов, которые обертывают весь Windows API. Вы можете использовать это для легкого доступа к базам данных MSI с С# или для написания пользовательских действий С#. Я могу предоставить дополнительную информацию об этом, если это желательно.
Когда мне приходилось делать это до того, как мы использовали функцию API Win32 из user32.dll, я думаю, что это было: ExitWindowsEx()