使用vcredist部署是一个合适的方法。
您可以使用FileSearch元素(Util扩展)搜索其中之一vcredist文件并检索其版本。但是,此方法由于burn内置变量SystemFolder
和System64Folder
与Windows Installer中类似的变量相反而变得复杂。VC14搜索示例:
<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"/>
<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"
注意:在这两种情况下,您需要将nnnnn
替换为您包含在安装程序中的vcredist版本号。
编辑1:作为另一种选择,您可以使用升级代码搜索来检测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提供。
尽管Visual Studio更新发布了更新版本的vcredist,但微软没有更新其网站上可下载的版本。
您可以使用<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已经安装则不会抛出错误。