【问题标题】:Prevent prerequisites from requesting restart, setup.exe setup project bootstrapper防止先决条件请求重启,setup.exe 设置项目引导程序
【发布时间】:2014-03-26 16:46:35
【问题描述】:

有没有办法使用传递给setup.exe 文件的某些命令行参数或类似的东西来防止先决条件(例如某些可再发行的 C++)请求重新启动?我试过/NOREBOOT/NORESTART,但都没有成功。

编辑

对我来说导致问题的确切先决条件是:vcredist_2008_x86.exe

【问题讨论】:

    标签: c# .net visual-studio-2010 installation setup-project


    【解决方案1】:

    在 .Net 引导程序中,如果执行的进程退出特定代码告诉它需要重新启动,通常不希望忽略这一点,因为它可能会进行严重或重要的更改,直到您重新启动才会生效。

    首先你需要检查你的进程退出的退出代码是什么,进入设置日志(通常位于%temp%\VS####.tmp)并寻找

    Process exited with code ###
    

    对我来说,进程以3010 代码退出。

    之后,您需要修改包的 product.xml 文件,以通过将以下内容添加到 ExitCodes 节点来使安装程序忽略该退出代码:

    <ExitCode Value="3010" Result="Success" />
    

    所以最终的product.xml文件内容应该是这样的:

    <?xml version="1.0" encoding="utf-8"?>
    <Product ProductCode="Microsoft Visual C++ 2008 Redistributable Package" xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper">
      <PackageFiles CopyAllPackageFiles="false">
        <PackageFile Name="vcredist_x86.exe" PublicKey="3082010A0282010100A2DB0A8DCFC2C1499BCDAA3A34AD23596BDB6CBE2122B794C8EAAEBFC6D526C232118BBCDA5D2CFB36561E152BAE8F0DDD14A36E284C7F163F41AC8D40B146880DD98194AD9706D05744765CEAF1FC0EE27F74A333CB74E5EFE361A17E03B745FFD53E12D5B0CA5E0DD07BF2B7130DFC606A2885758CB7ADBC85E817B490BEF516B6625DED11DF3AEE215B8BAF8073C345E3958977609BE7AD77C1378D33142F13DB62C9AE1AA94F9867ADD420393071E08D6746E2C61CF40D5074412FE805246A216B49B092C4B239C742A56D5C184AAB8FD78E833E780A47D8A4B28423C3E2F27B66B14A74BD26414B9C6114604E30C882F3D00B707CEE554D77D2085576810203010001" />
      </PackageFiles>
      <InstallChecks>
        <MsiProductCheck Property="IsInstalled" Product="{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}" />
      </InstallChecks>
      <Commands Reboot="None">
        <Command PackageFile="vcredist_x86.exe" Arguments="/q">
          <InstallConditions>
            <BypassIf Property="IsInstalled" Compare="ValueGreaterThan" Value="0" />
          </InstallConditions>
          <ExitCodes>
            <ExitCode Value="3010" Result="Success" />
            <DefaultExitCode Result="Success" String="Anunexpectedexitcodewasr" FormatMessageFromSystem="true" />
          </ExitCodes>
        </Command>
      </Commands>
    </Product>
    

    如果您使用Bootstrapper Manifest Generator,您可以简单地添加3010 退出代码并将结果设置为“成功”:

    【讨论】:

      【解决方案2】:

      使用 Visual C++ 2008 可再发行包(vcredist_x86.exe、vcredist_x64.exe 和 vcredist_ia64.exe)的命令行

      例如,如果您将 vcredist_x86.exe 下载到名为 c:\vc2008redist 的文件夹中,那么命令行将如下所示:

      c:\vc2008redist\vcredist_x86.exe /q /norestart

      上面的示例使用 /norestart 开关在设置过程完成后禁止重新启动。 /norestart 开关并不能完全消除重新启动的需要——它只是让调用进程控制何时安排重新启动,如果由于设置期间正在使用文件而需要重新启动。如果您使用 /norestart 开关运行 setup,则必须检查 setup 进程返回的退出代码并在调用进程中相应地处理它。以下是可能的退出代码:

      • 退出代码 0 表示设置成功,无需重新启动。
      • 退出代码 3010 表示安装成功,需要重新启动才能完成安装。
      • 任何其他退出代码都表示设置失败。

      来源:http://blogs.msdn.com/b/astebner/archive/2010/10/20/10078468.aspx

      【讨论】:

        【解决方案3】:

        如果您使用 /? 运行 vcredist exe?参数它显示一个带有选项的消息框。它以小写形式列出 /norestart,它可能区分大小写。

        【讨论】:

        • 对我来说导致问题的确切先决条件是:vcredist_2008_x86.exe,而这根本没有(norestart)选项:(
        【解决方案4】:

        如果可执行文件不提供命令行参数,我不相信您可以直接执行此操作。您始终可以通过 c# 使用 WIN API 来拦截关闭/重启消息。

        Catch Shutdown event with example code

        System Shutdown Functions (AbortSystemShutdown function)

        【讨论】:

          猜你喜欢
          • 2014-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-09
          • 1970-01-01
          相关资源
          最近更新 更多