Принудительная перезагрузка из Custom Action в Msi в C #

2

Как мы можем запросить перезагрузку компьютера после установки из пользовательского действия С#?

Мы используем проект установки 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(), и ни одно из этих событий не будет срабатывать из пользовательского действия С#...

Теги:
visual-studio
windows-installer
custom-action

4 ответа

1
Лучший ответ

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

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

B) Повторите проект установки с помощью WiX или Install Shield

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

2

Вам нужно добавить или вызвать пользовательское действие 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 с условием публичного свойства, которое ваши настраиваемые наборы действий.

  • 0
    Это в C #, а не в C ++. Система пользовательских действий C #, поставляемая с Visual Studio, не так сложна, и мы получаем только 3 метода для переопределения Install (), Uninstall (), Rollback (). Можно ли выполнить ваш ответ с помощью метода установки, который мы используем в настоящее время? Мы точно не хотим переписывать наш проект установки на C ++.
  • 0
    MS реализовала пользовательское действие C ++ под названием InstallUtilLib, которое поставляется вместе с Visual Studio. По сути, это просто оболочка C # и системы пользовательских действий .Net как хакерский способ запуска управляемого пользовательского действия. Хотелось бы, чтобы мы использовали что-то вроде WiX с самого начала, но мы ищем патч, а не переписать.
Показать ещё 2 комментария
0

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

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

  • 0
    Есть ли способ запустить ScheduleReboot из стандартной системы пользовательских действий для C #, включенной в VS 2005? Если так, у вас есть пример? К сожалению, у нас нет времени, чтобы повторить наш установочный проект с WiX, мы бы предпочли сделать что-то хакерское, когда мы запустим процесс, который ожидает выхода msiexec.exe и предложит перезагрузить, а не повторить нашу установку.
  • 0
    Понять, откуда ты. Это действительно хакерство, но вы должны быть в состоянии взять скомпилированный MSI из VS и открыть его с помощью Orca (редактор таблиц Msi, получить из SDK). Затем вы можете просто изменить таблицу InstallExecuteSequence, добавив строку, такую как: Action: ScheduleReboot Условие: не установлено И MYCUSTOMPROPERTY Sequence: 6500 (должно быть уникальным и перед InstallFinalize). Затем вы устанавливаете MYCUSTOMPROPERTY в своем пользовательском действии C #, если (и только если) требуется перезагрузка.
Показать ещё 8 комментариев
0

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

  • 0
    Нам нужно что-то встроенное в систему пользовательских действий MSI. Мы всегда можем программно перезагрузить компьютер с помощью shutdown.exe (или вашей функции Win32), но ищем лучшее решение, так как MSI сначала нужно правильно завершить.
  • 0
    У нас была библиотека пользовательских действий C ++, которая перезапускалась бы при необходимости, и теперь, когда я об этом думаю, она, вероятно, установила флаг MSI REBOOT, а не напрямую вызывала функцию Win32. Это было какое-то время, поэтому я не уверен ... Пользовательские действия на C ++ не слишком ужасны для написания, так что я не исключаю этого.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню