在我的 Wix 安装程序中,由于文件较小,我集成了 MSVC 可再发行运行时库,而不是完整的 VC Redist 包。在我的机器上,这些文件位于
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Redist\MSVC\14.38.33130\x86\Microsoft.VC143.CRT
。现在我想从 Wix 中的变量获取该路径,因为该路径会根据 Visual Studio 版本、MSVC 版本等而有所不同。
MSBuild 提供了一个宏
$(VC_CppRuntimeFilesPath_x86)
,它可以解析为 C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Redist\MSVC\14.38.33130\x86
,从那里我可以轻松构建正确的路径。
我尝试了这些说明中的语法将 MSBuild 宏捕获到 Wix 预处理器变量中。
<!-- Setup.wixproj -->
<Project Sdk="WixToolset.Sdk/4.0.3">
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<DefineConstants>Debug</DefineConstants>
</PropertyGroup>
<PropertyGroup Label="Globals">
<DefineConstants>MsvcCrtX86=$(VC_CppRuntimeFilesPath_x86);MsvcCrtX64=$(VC_CppRuntimeFilesPath_x64);</DefineConstants>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="WixToolset.UI.wixext" Version="4.0.3" />
</ItemGroup>
</Project>
<!-- Product.wxs -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:ui="http://wixtoolset.org/schemas/v4/wxs/ui">
...
<Fragment>
<ComponentGroup>
<Component Id="VCRT32" Directory="INSTALLFOLDER" Bitness="always32">
<File Source="$(var.MsvcCrtX86)\concrt140.dll" />
<File Source="$(var.MsvcCrtX86)\msvcp140.dll" />
<File Source="$(var.MsvcCrtX86)\msvcp140_1.dll" />
<File Source="$(var.MsvcCrtX86)\msvcp140_2.dll" />
<File Source="$(var.MsvcCrtX86)\msvcp140_atomic_wait.dll" />
<File Source="$(var.MsvcCrtX86)\msvcp140_codecvt_ids.dll" />
<File Source="$(var.MsvcCrtX86)\vccorlib140.dll" />
<File Source="$(var.MsvcCrtX86)\vcruntime140.dll" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
不幸的是,Wix 预处理器中的
MsvcCrtX86
和 MsvcCrtX64
变量保持为空。我的疑问是,MSBuild 仅填充 $(VC_CppRuntimeFilesPath_x86)
和类似的宏用于 .vcxproj
项目,而不是 SDK 样式项目。
您可以像下面一样检查并执行 VC redist
注意条件
版本 NT64 且(不是 VC2015x64Installed 或 VC2015x64BuildNumber < "31938"
<ExePackage Id="VC2015Redist"
SourceFile="$(var.SolutionDir)build\vc2015redist-extracted\VC2015redist-x64.exe"
Vital="yes"
Permanent="yes"
Compressed="yes"
Cache="no"
SuppressSignatureVerification="yes"
InstallCondition="VersionNT64 AND (NOT VC2015x64Installed OR VC2015x64BuildNumber < "31938")"
InstallCommand = "/install /quiet /norestart"
>