【问题标题】:Wix Burn vcredistWix Burn vcredist
【发布时间】:2016-05-23 17:09:27
【问题描述】:

我有一个使用 Visual Studio 2015 开发的 c++ 应用程序,以及一个 Wix 安装程序和一个 Burn 引导程序。该应用程序的早期版本能够使用 Visual Studio 合并模块来安装必要的先决条件,但在使用 Visual Studio 2015 时,这似乎不是一个选项(请参阅Redistributables for deploying C++ exe developed with Visual Studio 2015 on Windows 7)。

按照该链接中的建议,我们已经开始使用带有 vital="yes" 的 ExePackage 安装带有 Burn 的 vcredist。这通常效果很好 - 我们有几个客户由于 vcredist 的各种问题而安装失败。直到最近,这些都是会导致安装失败的错误。

在过去的几天里,我们收到了几份由于安装了更新版本的可再发行组件而导致安装程序失败的报告:vcredist 失败,错误代码为 0x80070666,这导致我们的引导程序失败。

我的问题是:

  1. 部署 vcredist 是“正确”的方法吗? (假设我们需要一个 exe 安装程序)
  2. 我们如何知道安装了哪些版本的可再发行组件(不一定在引导程序中,此信息是否以用户可读的形式存储在某处)?
  3. 是否有我们应该分发的更新版本的可再发行产品? (目前使用 14.0.23026)这是基于用于编译的 Visual Studio 版本还是我们应该始终分发最新版本? (当前 VS 版本 14.0.23107.0)
  4. 作为最后的手段,是否可以检测从 vcredist 返回的错误代码并允许该值确定安装是继续还是失败?

【问题讨论】:

    标签: visual-studio-2015 wix burn vcredist


    【解决方案1】:
    1. 部署 vcredist 是一种合适的方法。

    2. 您可以使用FileSearch Element (Util Extension) 搜索其中一个 vcredist 文件并检索其版本。然而,这种方法很复杂,因为内置变量 SystemFolderSystem64Folder 与 Windows Installer 中的类似变量相反。 VC14 搜索示例:

      <!-- Detect existing version of VC ++ 2015 x64 libraries -->
      <util:FileSearch Id="GetVC14X64Exists" Condition="VersionNT64" Variable="vc14x64Exists" Path="[SystemFolder]vcruntime140.dll" Result="exists"/>
      <util:FileSearch Id="GetVC14X64Version" Condition="VersionNT64" Variable="vc14x64Version" Path="[SystemFolder]vcruntime140.dll" Result="version"/>
      
      <!-- Detect existing version of VC ++ 2015 x86 libraries -->
      <util:FileSearch Id="GetVC14X86onX64Exists" Condition="VersionNT64" Variable="vc14x86Exists" Path="[System64Folder]vcruntime140.dll" Result="exists"/>
      <util:FileSearch Id="GetVC14X86onX64Version" Condition="VersionNT64" Variable="vc14x86Version" Path="[System64Folder]vcruntime140.dll" Result="version"/>
      <util:FileSearch Id="GetVC14X86onX86Exists" Condition="NOT VersionNT64" Variable="vc14x86Exists" Path="[SystemFolder]vcruntime140.dll" Result="exists"/>
      <util:FileSearch Id="GetVC14X86onX86Version" Condition="NOT VersionNT64" Variable="vc14x86Version" Path="[SystemFolder]vcruntime140.dll" Result="version"/>
      

      变量vc14x64Existsvc14x64Version 然后可以在DetectCondition 中使用,以确定是否安装了 64 位版本的 VC14:

      DetectCondition="vc14x64Exists AND vc14x64Version &gt;= v14.0.nnnnn"
      

      同样,32 位版本的 VC14 的 DetectCondition 是:

      DetectCondition="vc14x86Exists AND vc14x86Version &gt;= v14.0.nnnnn"
      

      注意:在这两种情况下,您都需要将 nnnnn 替换为您在安装程序中包含的 vcredist 的内部版本号。

      编辑 1: 作为替代方案,您可以使用here 概述的升级代码搜索来检测 VC Redist 的存在。

      编辑 2: 在我编写的安装程序中,我通常不会尝试检测 VC Redist 的存在。相反,我让 VC Redist 安装程序运行,让它自己决定是安装、升级还是什么都不做。

    3. 到目前为止,我已经找到了三个版本的 VC14 redist 文件:

      a) 14.0.23026 - 可从 Microsoft 的链接 here 下载。

      b) 14.0.23506 - 随 Visual Studio 2015 更新 1 提供。

      c) 14.0.23918 - 随 Visual Studio 2015 更新 2 提供。

      虽然更新版本的 vcredist 已随 Visual Studio 更新一起发布,但 Microsoft 尚未更新可从其网站下载的版本。

    4. 您可以使用 &lt;ExitCode Value="1638" Behavior="success"/&gt; 告诉 Burn 忽略已安装的错误代码 0x80070666。请注意,1638 = 0x666。例如:

      <!-- Microsoft Visual C++ 2015 x86 libraries -->
      <PackageGroup Id="VC14RedistX86">
        <ExePackage
           Cache="no"
           Compressed="yes"
           PerMachine="yes"
           Permanent="yes"
           Vital="yes"
           Name="Redist\vcredist14_x86.exe"
           SourceFile="$(var.RedistPath)\VC14\vcredist_23918_x86.exe"
           InstallCommand="/install /quiet /norestart">
      
           <!-- -->
           <ExitCode Value="3010" Behavior="forceReboot"/>
      
           <!-- Ignore "Newer version installed" error -->
           <ExitCode Value="1638" Behavior="success"/>
        </ExePackage>
      </PackageGroup>
      

    我最近遇到了类似的问题,我正在处理的产品安装程序因错误 0x80070666 而停止。问题是已经安装了较新版本的 vcredist。我最终使用的解决方案是:a) 包括最新版本的 vcredist (14.0.23918),以及 b) 添加 &lt;ExitCode Value="1638" Behavior="success"/&gt; 指令来告诉 Burn 如果已经安装了未来更新版本的 vcredist,则不要抛出错误。

    【讨论】:

    • 很棒的答案!澄清一下——到目前为止,我们的非正式测试没有遇到任何问题,使用新版本的可再发行组件针对针对旧版本编译的可执行文件(即,我们尚未升级到 Visual Studio 2015 更新 1 或 2)。是否可以保证是这种情况,还是我们需要在开始发布更新的可再发行组件之前升级 Visual Studio?
    • 在我的测试中,我没有发现在已经安装了新版本 vcredist 的计算机上运行使用旧版本 vcredist 构建的产品有任何问题。但是,不能保证 vcredist 的未来版本不会破坏某些东西。我倾向于使用最新版本的 vcredist,假设最新版本具有最新的错误和安全修复等。
    • 是否有可以读取的注册表项以确定当前安装的版本并将其用作 exe 包的安装条件? “安装条件”wixtoolset.org/documentation/manual/v3/xsd/wix/exepackage.html
    • @tollgen - 我不知道可以轻松读取以检测 exepackage 存在的注册表项。我已经用 FileSearch 可能如何工作的具体细节更新了我的答案。
    • 很好地了解 ExitCode 属性,这正是我所需要的!但实际上有一个注册表项,您可以查找已安装的 VCRedist 版本:我使用 在我的 x64 安装上(对于“次要”和“构建”版本号类似。
    【解决方案2】:

    要检测是否存在 vcredist 软件包,您需要通过其 UpgradeCode 进行搜索。
    这将确保找到更高版本。

    在 wix burn 引导程序中使用 util:ProductSearchUpgradeCode 参数。 然后在DetectCondition 中指定一个最低 版本。

    有关详细信息,请参阅我的这个答案:https://stackoverflow.com/a/35889484

    【讨论】:

    • 当前版本是通过刻录包部署的。它们确实有不同的捆绑 ID。目前无法使用util:ProductSearch 查找此内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多