2009-07-24 5 views
2

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

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

ОБНОВЛЕНИЕ: Мы ищем то, что уже встроено в систему пользовательских действий MSI. Если этого не существует, мы можем как-то прибегнуть к перезагрузке ПК, но хотелось бы избежать этого.

UPDATE: Мы видим, где вы можете установить REBOOT = Force при редактировании Msi в Orca, можете ли вы изменить эти таблицы из пользовательского действия C# во время выполнения? Мы могли бы установить это для перезапуска каждый раз, но это может привести к раздражению нашей установки (ее нужно будет перезагрузить только в редких случаях).

UPDATE: Мы пытались настройки:

savedState["REBOOT"] = "Force"; 

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

Также пробовал:

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

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

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

UPDATE. Мы попытались закреплять в AppDomain.ProcessExit и AppDomain.DomainUnload и начать новую нить и вызывая Process.GetCurrentProcess() WaitForExit() и ни одно из этих событий не будет стрелять изнутри # пользовательских действий C ...

ответ

1

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

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

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

Спасибо за помощь.

0

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

+0

Нам нужно что-то встроенное в пользовательскую систему действий MSI. Мы всегда можем программно перезагрузить ПК с помощью shutdown.exe (или вашей функции Win32), но ищем лучшее решение, так как MSI необходимо сначала закончить правильно. – jonathanpeppers

+0

У нас была специальная библиотека действий C++, которая при необходимости перезапустилась, и теперь, когда я думаю об этом, он, вероятно, установил флаг MSI REBOOT вместо прямого вызова функции Win32. Это было какое-то время, поэтому я не уверен ... C++ пользовательские действия не слишком страшны для написания, поэтому я бы не стал это исключать. – Sneal

+0

Знаете, как установить флаги MSI из управляемого пользовательского действия? Я думаю, что это может быть невозможно ... – jonathanpeppers

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++. – jonathanpeppers

+0

MS реализовала пользовательское действие C++ под названием InstallUtilLib, которое поставляется с визуальной студией. В основном это просто оболочка C# и. NET системы пользовательских действий как хакерский способ запуска управляемого пользовательского действия. Хотелось бы, чтобы мы использовали что-то вроде WiX с самого начала, но мы ищем патч, а не переписываем. – jonathanpeppers

+0

С вашей архитектурой я согласен с Glytzhkof, что добавление его в ваш InstallExecuteSequence с условием - лучший способ пойти. Вы можете автоматизировать это с помощью MSI API. Я использовал оболочку MSI API C#, доступную здесь, http://sourceforge.net/projects/izfree/files/, чтобы написать несколько небольших исполняемых файлов для автоматизации задач сборки MSI. Вы можете легко написать небольшой исполняемый файл, а затем выполнить задачу пост-сборки, чтобы добавить необходимую информацию. MSI - это просто база данных для установки с очень строгой грамматикой SQL. – LanceSc

0

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

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

+0

Есть ли способ запустить ScheduleReboot из стандартной настраиваемой системы действий для C#, включенной в VS 2005? Если да, у вас есть пример? К сожалению, у нас нет времени, чтобы переустановить наш проект установки с помощью WiX, мы скорее сделаем что-то взломанное, где мы запустим процесс, ожидающий выхода msiexec.exe, и предложим перезагрузить, чем повторить нашу настройку. – jonathanpeppers

+0

Поймите, откуда вы. Это действительно вредно, но вы должны иметь возможность взять скомпилированный MSI из VS и открыть с помощью Orca (редактор таблиц Msi, получить из SDK). Затем вы можете просто изменить таблицу InstallExecuteSequence, добавив строку, такую ​​как: Действие: ScheduleReboot Условие: Не установлено И MYCUSTOMPROPERTY Последовательность: 6500 (должна быть уникальной и до InstallFinalize). Затем вы устанавливаете MYCUSTOMPROPERTY в своем пользовательском действии C#, если (и только если) требуется перезагрузка. –

+0

Мы попробуем трюк Орки, я дам вам знать наши результаты. – jonathanpeppers