在Wix中访问Visual Studio C++项目变量的可行性及替代方案
首先直接给结论:默认情况下不可行,因为Wix项目(即使是在VS2015中搭配Wix Extension 0.9.21和V4工具集)不会自动导入C++项目依赖的Windows SDK相关MSBuild属性集,所以那些$(WindowsSdkDir)、$(UniversalCRT_LibraryPath_x86)这类变量在Wix项目的预/后构建步骤或项目文件中是未定义的。不过有几种可靠的解决办法:
方法1:手动导入Windows SDK的MSBuild属性文件
C++项目之所以能访问这些变量,是因为它们自动导入了Windows SDK对应的.props和.targets文件。你可以在你的Wix项目文件(.wixproj)中手动添加这些导入语句,让Wix项目加载这些属性:
打开你的.wixproj文件,在现有<Import>节点(比如导入Wix工具集的节点)之后添加以下内容:
<!-- 导入Windows SDK属性 --> <Import Project="$(MSBuildExtensionsPath)\Microsoft\Windows Kits\10\Microsoft.WindowsSDK.props" Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\Windows Kits\10\Microsoft.WindowsSDK.props')" /> <!-- 导入Windows SDK目标文件 --> <Import Project="$(MSBuildExtensionsPath)\Microsoft\Windows Kits\10\Microsoft.WindowsSDK.targets" Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\Windows Kits\10\Microsoft.WindowsSDK.targets')" />
保存后重新加载项目,此时你应该能在预构建、后构建步骤或Wix项目文件中正常访问$(WindowsSdkDir)、$(UniversalCRT_LibraryPath_x86)等变量了。
方法2:自定义MSBuild属性手动计算路径
如果导入SDK的属性文件出现兼容性问题(比如VS2015对应的SDK版本路径不同),你可以直接在.wixproj中通过MSBuild的注册表查询功能定义这些变量:
<PropertyGroup> <!-- 从注册表获取Windows SDK根目录 --> <WindowsSdkDir>$([MSBuild]::GetRegistryValue('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot10'))</WindowsSdkDir> <!-- 手动构造Universal CRT x86库路径(注意替换为你实际使用的SDK版本号) --> <UniversalCRT_LibraryPath_x86>$(WindowsSdkDir)lib\10.0.10240.0\ucrt\x86</UniversalCRT_LibraryPath_x86> </PropertyGroup>
注意:VS2015默认搭配的Windows 10 SDK版本通常是10.0.10240.0或10.0.10586.0,你可以根据自己安装的SDK版本调整路径中的版本号。
方法3:在构建步骤中通过命令行获取路径
如果不想修改.wixproj文件,也可以在预构建/后构建步骤中直接通过命令行查询注册表获取这些路径,比如:
在预构建步骤中添加以下命令(注意如果是在MSBuild脚本中使用,需要把%a改成%%a):
@echo off :: 从注册表获取Windows SDK根目录 for /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows Kits\Installed Roots" /v KitsRoot10') do set WINDOWSSDKDIR=%%b :: 构造Universal CRT x86路径 set UNIVERSALCRT_LIB_X86=%WINDOWSSDKDIR%lib\10.0.10240.0\ucrt\x86 :: 后续步骤可以使用这些环境变量 echo Using Universal CRT Path: %UNIVERSALCRT_LIB_X86%
这样在构建步骤中就能通过环境变量访问这些路径了。
内容的提问来源于stack exchange,提问作者A Murray




