You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在Wix中访问Visual Studio C++项目变量的可行性及替代方案

解答:Wix V4项目访问C++ MSBuild变量的问题

首先直接给结论:默认情况下不可行,因为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.010.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

火山引擎 最新活动