C# 在C中的Msi中强制从自定义操作重新启动#

C# 在C中的Msi中强制从自定义操作重新启动#,c#,visual-studio,windows-installer,custom-action,C#,Visual Studio,Windows Installer,Custom Action,在C#自定义操作中安装后,如何提示计算机重新启动 我们正在使用VS2005的安装项目进行安装,并且我们需要以编程方式决定是否提示重新启动(因此它不会在每次安装中都发生,只是在某些安装中) 更新:我们正在寻找一些已经内置到MSI自定义操作系统第一。如果不存在这种情况,我们可以自己重新启动电脑,但我们希望避免这种情况 更新:我们看到在Orca中编辑Msi时可以在哪里设置REBOOT=Force,您可以在运行时从C#自定义操作修改这些表吗?我们可以将此设置为每次重新启动,但这可能会使我们的设置变得烦人

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

我们正在使用VS2005的安装项目进行安装,并且我们需要以编程方式决定是否提示重新启动(因此它不会在每次安装中都发生,只是在某些安装中)

更新:我们正在寻找一些已经内置到MSI自定义操作系统第一。如果不存在这种情况,我们可以自己重新启动电脑,但我们希望避免这种情况

更新:我们看到在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#自定义操作中触发…

在使用user32.dll中的Win32 API函数之前,我必须这样做,我想就是这样:

您需要在InstallExecuteSequence中添加或调用MSI自定义操作计划Reboot。您可以在自定义操作中使用MSI函数msidAction来实现这一点。请注意,安排此操作的自定义操作必须是即时自定义操作,而不是延迟自定义操作。这意味着您可能需要在InstallFinalize之后安排它。您还可以将其添加到InstallExecuteSequence中,并在自定义操作设置的公共属性上设置一个条件。

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


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

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

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

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


感谢大家的帮助。

我们需要MSI自定义操作系统内置的东西。我们总是可以用Studio.EXE(或者Win32函数)编程重新启动PC,但是寻找一个更好的解决方案,因为MSI需要首先正确完成。如果需要的话,我们有一个C++自定义动作库,如果我想的话,它可能设置MSI重启动标志而不是直接调用Win32函数。已经有一段时间了,所以我不确定。。。C++自定义操作不太可怕,无法进行写入,所以我不排除它。知道如何从托管自定义操作设置MSI标志吗?我认为这可能是不可能的…这是在C,而不是C++。Visual Studio附带的C#自定义操作系统没有那么复杂,我们只有3种方法来覆盖Install()、Uninstall()和Rollback()。您的回答可以用我们目前使用的设置方法完成吗?我们当然不想在C++中重新编写我们的安装项目。MS实现了一个C++定制的动作,称为StudioLILIB,它是用VisualStudio来传输的。这基本上只是将C.NET和.NET自定义操作系统打包成运行托管的自定义操作的一种方法。我希望我们从一开始就使用类似WiX的东西,但我们正在寻找修补程序,而不是重写。对于您的体系结构,我同意Glytzhkof的观点,将其添加到您的InstallExecuteSequence中并附带条件是最好的方法。您可以通过MSIAPI自动执行此操作。我使用了这里提供的MSIAPI C#包装器,编写了许多小型可执行文件,用于自动化MSI构建任务。您可以轻松地编写一个小的可执行文件,然后让它执行构建后任务以添加必要的信息。MSI只是一个安装数据库,具有非常严格的SQL语法。从某种意义上说,这可能感觉像是一种黑客行为。VisualStudio部署项目只能处理非常简单的任务,这就是我们最终放弃它们的原因。如果您发现自己需要实现另一个类似的解决方案,我强烈建议您减少损失,并找到一个新的MSI前端。有没有办法从VS2005附带的C#标准自定义操作系统运行ScheduleReboot?如果有,你有没有一个例子?遗憾的是,我们没有时间用WiX重做我们的安装项目,我们宁愿在运行等待msiexec.exe退出并提示重新启动的进程时做一些骇人的事情,也不愿重做我们的安装。了解您来自何方。它确实是有黑客攻击性的,但是您应该能够从VS获取编译后的MSI,并使用Orca(MSI表编辑器,从SDK获取)打开它。然后,只需添加一行即可修改InstallExecuteSequence表,例如:Action:ScheduleReboot Condition:Not Installed和MYCUSTOMPROPERTY Sequence:6500(必须是唯一的,并且在InstallFinalize之前)。然后,如果(且仅当)需要重新启动,您可以在C#custom action中设置MYCUSTOMPROPERTY。如果它不起作用,您可以将MSI转发给我(如果可能的话),我会快速查看。直到下周一,我们有一个人在度假。您如何修改该值