【发布时间】:2014-09-26 13:55:20
【问题描述】:
我有一个 Windows 安装引导程序,setup.exe。它用于下载和安装 Microsoft 必备软件(.NET Framework 3.5、Microsoft Visual Studio Tools for Office Runtime (VSTO) 等)。 VSTO 是有问题的,因为在某些主机 Windows 操作系统版本上它会强制重启。这可能会导致客户非常沮丧,因为他们没有时间保存他们的工作。因此,我需要停止这种行为。
在 C# 中,有什么方法可以阻止另一个进程重新启动 Windows?
我发现解决此问题的唯一有用方法是 P/Invoking ShutdownBlockReasonCreate。但这不够透明,因为此方法会阻止特定进程的关闭,而不是与导致关闭的进程相同的进程,因此很烦人,因为向用户显示了操作系统关闭屏幕,并且在该屏幕中正在运行的进程列表,阻止关机的进程,以及取消或继续关机的按钮。我希望有一种更透明的方式来处理这个问题。
编辑:正如另一个 Alex 提到的,msiexec 支持 [/norestart][/promptrestart][/forcerestart]。但是,在我的 WiX 项目中,我不知道如何将命令行参数传递给安装这些先决条件的 MSI。我的引导程序setup.exe 生成如下:
<Target Name="AfterBuild">
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<BootstrapperFile Include="Microsoft.Net.Framework.3.5.SP1">
<ProductName>.NET Framework 3.5 SP1</ProductName>
</BootstrapperFile>
<BootstrapperFile Include="Microsoft.VSTORuntime.4.0">
<ProductName>Microsoft Visual Studio 2010 Tools for Office Runtime (x86 and x64)</ProductName>
</BootstrapperFile>
</ItemGroup>
</BootstrapperFile>
<GenerateBootstrapper ApplicationFile="$(TargetFileName)" ApplicationName="My Application" BootstrapperItems="@(BootstrapperFile)" ComponentsLocation="HomeSite" CopyComponents="False" OutputPath="$(OutputPath)" Path="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\BootStrapper" ApplicationRequiresElevation="True" Culture="en-US" Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' " />
</Target>
以上内容位于我的 .wixproj 文件中。
【问题讨论】:
-
在您预期的示例中,该消息将指示已启动关闭的进程现在正在阻止关闭。这更令人困惑。
-
我会说这是安装程序的问题,应该在那里修复。它应该让用户选择是现在还是以后重新启动,而不是立即重新启动。
-
@ThomasW。是的,这就是为什么它绝对不是处理这种情况的最透明方式!真正的问题是,由于某种原因,VSTO 安装程序强制重启,即微软的安装程序,其中的逻辑超出了我的控制,我需要阻止它强制重启!
-
msiexec 支持 [/norestart][/promptrestart][/forcerestart]
-
在这种情况下可能无法使用
shutdown -a中止关机,因为关机顺序没有时间限制。
标签: c# .net windows winapi bootstrapper