3

从 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# 自定义操作中触发...

4

4 回答 4

4

您需要在 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。

于 2009-07-24T16:39:29.373 回答
1

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

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

B) 使用 WiX 或 Install Shield 重做设置项目

谢谢你们的帮助。

于 2009-08-07T15:00:30.147 回答
0

在我们使用来自 user32.dll 的 Win32 API 函数之前,我不得不这样做时,我想就是这样:ExitWindowsEx()

于 2009-07-24T15:19:20.607 回答
0

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

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

于 2009-07-27T17:17:37.243 回答