Visual studio 2015 Wix燃烧vcredit 我有一个使用Visual Studio 2015开发的C++应用程序,还有一个WiX安装程序和一个BooE引导程序。该应用程序的早期版本能够使用Visual Studio合并模块安装必要的先决条件,但在使用Visual Studio 2015时,这似乎不是一个选项(请参阅)

Visual studio 2015 Wix燃烧vcredit 我有一个使用Visual Studio 2015开发的C++应用程序,还有一个WiX安装程序和一个BooE引导程序。该应用程序的早期版本能够使用Visual Studio合并模块安装必要的先决条件,但在使用Visual Studio 2015时,这似乎不是一个选项(请参阅),visual-studio-2015,wix,burn,vcredist,Visual Studio 2015,Wix,Burn,Vcredist,按照该链接中的建议,我们已经开始使用带有vital=“yes”的ExePackage安装vcredit with Burn。这通常效果很好-我们有几个客户因为vcredist的各种问题而安装失败。直到最近,这些错误都会导致安装失败 在过去的几天里,我们收到了一些报告,说我们的安装程序由于安装了更新版本的可再发行版本而失败:vcredist失败,错误代码为0x80070666,这导致我们的引导程序失败 我的问题是: 部署vcredit是否是要采取的“正确”方法?(假设我们需要一个exe安装程序)

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

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

我的问题是:

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

  • 您可以使用搜索其中一个vcredist文件并检索其版本。但是,由于burn内置变量
    SystemFolder
    system64 folder
    与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"/>
    
    同样,32位版本VC14的检测条件为:

    DetectCondition="vc14x86Exists AND vc14x86Version &gt;= v14.0.nnnnn"
    
    注意:在这两种情况下,您都需要用安装程序中包含的vcredist的版本号替换
    nnnnn

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

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

  • 迄今为止,我发现了VC14 redist文件的三个版本:

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

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

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

    尽管vcredist的较新版本已随Visual Studio更新发布,但Microsoft尚未更新可从其网站下载的版本

  • 您可以使用
    告诉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而停止。问题是已经安装了较新版本的vcredit。我最终使用的解决方案是:a)包括最新版本的vcredist(14.0.23918),b)添加
    指令,告诉burn如果已经安装了未来较新版本的vcredist,不要抛出错误

    要检测vcredist包的存在,您需要通过其
    升级代码进行搜索
    这将确保找到更高版本

    在wix burn引导程序中,将
    util:ProductSearch
    UpgradeCode
    参数一起使用。 然后在
    检测条件中指定最低版本


    有关详细信息,请参阅我的答案:

    真棒的答案!澄清一下-到目前为止,我们的非正式测试还没有遇到任何问题,使用新版本的可再发行文件对根据旧版本编译的可执行文件进行测试(即,我们还没有升级到Visual Studio 2015 update 1或2)。在我们开始发布较新的可再发行版本之前,我们是否需要升级Visual Studio?在我的测试中,在已安装较新版本vcredist的计算机上运行使用较旧版本vcredist构建的产品时,我没有发现任何问题。然而,不能保证vcredist的未来版本不会破坏某些东西。我倾向于使用最新版本的vcredist,假设最新版本有最新的bug和安全修复程序等。是否有可以读取的注册表项来确定当前安装的版本,并将其用作exepackage的安装条件?“InstallCondition”@tollgen-我不知道有一个注册表项可以很容易地读取以检测execackage的存在。我已经更新了我的答案,详细介绍了文件搜索的工作原理。了解ExitCode属性非常好,这正是我所需要的!但实际上,有一个注册表项可以让您查找已安装的VCRedist版本:我在x64安装中使用(类似于“次要”和“构建”版本号)。当前版本是通过burn bundle部署的。它们确实有不同的bundle id。目前无法使用
    util:ProductSearch
    查找此项
    <!-- 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>