我有一个使用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 失败。
我的问题是:
最佳答案
SystemFolder
和System64Folder
的刻录,因此使此方法变得复杂。搜索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
中使用变量vc14x64Version
和DetectCondition
来确定是否安装了VC14的64位版本:DetectCondition="vc14x64Exists AND vc14x64Version >= v14.0.nnnnn"
同样,VC14的32位版本的
DetectCondition
为:DetectCondition="vc14x86Exists AND vc14x86Version >= v14.0.nnnnn"
注意:在这两种情况下,都需要用安装程序中包含的vcredist的内部版本号替换
nnnnn
。编辑1:作为替代方案,您可以使用here概述的升级代码搜索来检测VC Redist的存在。
编辑2:在我编写的安装程序中,我通常不尝试检测VC Redist的存在。相反,我让VC 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/