从C#中的Msi中的自定义操作强制重新引导

如何在C#自定义操作中安装后提示重新启动计算机?

我们正在使用VS 2005的安装项目进行设置,我们需要以编程方式决定提示重启(因此不会在每次安装时发生,只在某些安装上)。

更新:我们正在寻找已经内置到MSI自定义操作系统中的内容。 如果不存在,我们可以采取某种方式重新启动PC,但希望避免这种情况。

更新:我们看到在编辑Orca中的Msi时可以设置REBOOT = Force的位置,您可以在运行时从C#自定义操作修改这些表吗? 我们可以将其设置为每次都重新启动,但这可能会使我们的设置烦人(它只需要在极少数情况下重新启动)。

更新:我们尝试设置:

savedState["REBOOT"] = "Force"; 

从我们自定义操作的Install()方法中,但没有运气。 它似乎不像IDictionary,savedState真的做任何事情。

还尝试过:

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

但我认为这个集合只是传递给自定义操作的命令行参数。

更新:有没有办法用Orca编辑我们的MSI以使这个技巧有效? 也许在某些文件存在的情况下安排重启? 我们还没有找到如何从C#自定义操作设置MSI属性。

更新:我们尝试连接到AppDomain.ProcessExit和AppDomain.DomainUnload并启动一个新线程并调用Process.GetCurrentProcess()。WaitForExit()并且这些事件都不会从C#自定义动作中触发…

您需要在InstallExecuteSequence中添加或调用MSI自定义操作ScheduleReboot http://msdn.microsoft.com/en-us/library/aa371527(VS.85).aspx 。 您可以通过在自定义操作中使用MSI函数MsiDoAction, http://msdn.microsoft.com/en-us/library/aa370090( VS.85) .aspx来完成此操作。 请注意,安排此操作的自定义操作必须是立即自定义操作,而不是延迟自定义操作。 这意味着您可能需要在InstallFinalize之后安排它。 您还可以使用自定义操作设置的公共属性上的条件将其添加到InstallExecuteSequence。

看起来,我们解决这个问题的唯一方法是:

A)使用orca修改MSI以使每次安装都重新启动安装程序

B)使用WiX或Install Shield重做安装项目

谢谢你的帮助。

在我们使用user32.dll的Win32 API函数之前必须这样做时,我认为就是这样: ExitWindowsEx()

LanceSc给了你答案。 您需要运行ScheduleReboot,最好的方法是将其插入InstallExecuteSequence,该自定义属性由您在自定义操作中设置的自定义属性调整。

正如您所提到的,Wix是未来灵活性的方式。 Wix现在还包括DTF(部署工具基础),它是一组丰富的.NET类库,用于包装整个Windows API。 您可以使用它从C#轻松访问MSI数据库或编写C#自定义操作。 如果需要,我可以提供更多相关信息。