我有一个使用Visual Studio 2015开发的c++应用程序,以及Wix安装程序和Burn bootstrap。该应用程序的早期版本能够使用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,这导致我们的 bootstrap 失败。

我的问题是:

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

  • 部署vcredist是一种适当的方法。
  • 您可以使用FileSearch Element (Util Extension)搜索vcredist文件之一并获取其版本。但是,由于Windows Installer中类似的变量会颠倒内置变量SystemFolderSystem64Folder的刻录,因此使此方法变得复杂。搜索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"/>
    

    然后可以在vc14x64Exists中使用变量vc14x64VersionDetectCondition来确定是否安装了VC14的64位版本:
    DetectCondition="vc14x64Exists AND vc14x64Version &gt;= v14.0.nnnnn"
    

    同样,VC14的32位版本的DetectCondition为:
    DetectCondition="vc14x86Exists AND vc14x86Version &gt;= v14.0.nnnnn"
    

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

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

    编辑2:在我编写的安装程序中,我通常不尝试检测VC Redist的存在。相反,我让VC Redist安装程序运行,让自己确定是要安装,升级还是什么都不做。
  • 到目前为止,我已经找到了VC14 redist文件的三个版本:

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

    b)14.0.23506-Visual Studio 2015 Update 1提供

    c)14.0.23918-与Visual Studio 2015 Update 2一起提供。

    尽管vcredist的较新版本已随Visual Studio更新发布,但Microsoft尚未更新可从其网站下载的版本。
  • 您可以使用<ExitCode Value="1638" Behavior="success"/>告诉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)添加<ExitCode Value="1638" Behavior="success"/>指令以告诉Burn如果已经安装了将来的较新版本的vcredist,则不要抛出错误。

    关于visual-studio-2015 - Wix Burn vcredist,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37396773/

    10-11 16:21