2016-05-23 112 views
15

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

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

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

我的问题是:

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

回答

21
  1. 部署vcredist是一种适当的方法。

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

    <!-- 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被用于制定出是否安装VCl 4的64位的版本:

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

    类似地DetectCondition为VCl 4的32位版本:

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

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

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

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

  3. 迄今为止我已经找到了VCl 4 REDIST文件的三个版本:

    一)14.0.23026 - 下载从微软的链接here

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

    c)14.0.23918 - 提供了Visual Studio 2015 Update 2

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

  4. 您可以使用<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,则不会抛出错误。

+0

太棒了!为了澄清 - 迄今为止我们的非正式测试没有遇到任何问题,即针对针对旧版本编译的可执行文件(即,我们尚未升级到Visual Studio 2015更新1或2)使用新版本的可再发行组件。这是保证是这种情况,还是我们需要升级Visual Studio之前,我们开始运送新的可再分发? – Runt8

+1

在我的测试中,我没有发现运行vcredist早期版本的计算机上已安装vcredist的新版本生成的产品的任何问题。但是,不能保证vcredist的未来版本不会破坏某些东西。我倾向于使用vcredist的最新版本,假设最新版本具有最新的错误和安全修补程序等。 – bradfordrg

+0

是否存在可以读取的注册表项,以确定当前安装的版本并将其用作installcondition为exepackage? “InstallCondition” http://wixtoolset.org/documentation/manual/v3/xsd/wix/exepackage.html – tollgen

2

检测到您需要通过其UpgradeCode进行搜索的vcredist包的存在。
这将确保发现更新的版本。

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

查看全部资料看这个回答:https://stackoverflow.com/a/35889484

+0

当前版本是通过烧录包部署的,它们有不同的包ID。 'util:ProductSearch'目前 –

相关问题