使用Microsoft.Build.NoTargets时获取UCRT路径的问题
问题:NoTargets项目中如何使用$(UniversalCRT_PropsPath)替代硬编码的uCRT.props路径?
我创建了一个使用Microsoft.Build.NoTargets的MSBuild项目,需要导入路径为C:\Program Files (x86)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\uCRT.props的文件。我希望使用内置变量$(UniversalCRT_PropsPath)替代完整路径,但该变量在使用Microsoft.Build.NoTargets时未定义,请问是否需要先导入其他内容?
项目代码如下:
<Project> <Import Project="Sdk.props" Sdk="Microsoft.Build.NoTargets" Version="3.7.0" /> <PropertyGroup> <TargetFramework>net472</TargetFramework> <TargetPlatformVersion>10.0.22621.0</TargetPlatformVersion> <WindowsTargetPlatformVersion>10</WindowsTargetPlatformVersion> <PlatformToolset Condition="'$(VisualStudioVersion)'=='17.0'">v143</PlatformToolset> <Platforms>x64;x86</Platforms> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'"> <Platform>x86</Platform> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <Platform>x64</Platform> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'"> <Platform>x86</Platform> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <Platform>x64</Platform> </PropertyGroup> <Import Project="C:\Program Files (x86)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\uCRT.props"/> <Target></Target> </Project>
解决方案
是的,你需要先导入Windows C++工具链的基础配置文件,因为Microsoft.Build.NoTargets是极简SDK,默认不包含Windows SDK相关的变量初始化逻辑。具体操作如下:
- 首先导入
Microsoft.Cpp.Default.props,这个文件会根据你设置的TargetPlatformVersion、PlatformToolset等变量自动定位Windows SDK路径,并初始化UniversalCRT_PropsPath等相关变量。 - 注意导入顺序:必须在
Sdk.props之后导入Microsoft.Cpp.Default.props,这样才能保证变量被正确初始化。
修改后的项目代码如下:
<Project> <Import Project="Sdk.props" Sdk="Microsoft.Build.NoTargets" Version="3.7.0" /> <!-- 导入C++默认配置,初始化Windows SDK相关变量 --> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <PropertyGroup> <TargetFramework>net472</TargetFramework> <TargetPlatformVersion>10.0.22621.0</TargetPlatformVersion> <WindowsTargetPlatformVersion>10</WindowsTargetPlatformVersion> <PlatformToolset Condition="'$(VisualStudioVersion)'=='17.0'">v143</PlatformToolset> <Platforms>x64;x86</Platforms> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'"> <Platform>x86</Platform> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <Platform>x64</Platform> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'"> <Platform>x86</Platform> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <Platform>x64</Platform> </PropertyGroup> <!-- 使用初始化后的变量导入uCRT.props --> <Import Project="$(UniversalCRT_PropsPath)" /> <Target></Target> </Project>
补充说明:$(VCTargetsPath)是Visual Studio自动设置的内置变量,指向当前VS版本的C++ MSBuild工具链路径,无需手动硬编码,能保证在不同环境下的兼容性。
内容的提问来源于stack exchange,提问作者Michael T
相关产品推荐
相关产品推荐

