如何在MSBuild中获取SDK名称,区分项目配置TargetFramework
获取C#项目SDK名称并区分WPF项目配置TargetFramework
问题描述
我有一个C# SDK项目文件:
<Project Sdk="Microsoft.NET.Sdk"> ... </Project>
如何将SDK名称作为变量获取?
使用场景:
我维护一个包含WPF项目和类库项目的大型解决方案,希望在Directory.Build.props中统一配置TargetFramework。但需要区分WPF项目与非WPF项目来设置正确的TargetFramework——我想检查项目是否使用了Microsoft.NET.Sdk.WindowsDesktop SDK。目前我依赖项目命名规则(名称包含.Wpf)来判断,这种方式很不规范。
当前代码如下:
<Choose> <!-- - HACK to apply net7.0-windows to all Wpf-Projects--> <When Condition="'$(MSBuildProjectName.Contains(`.Wpf`))' == 'true'"> <PropertyGroup> <TargetFrameworks>net7.0-windows</TargetFrameworks> </PropertyGroup> </When> <Otherwise> <PropertyGroup> <TargetFrameworks>net7.0</TargetFrameworks> </PropertyGroup> </Otherwise> </Choose>
解决方案
获取SDK名称变量
MSBuild内置了$(MSBuildProjectSdkName)属性,可直接获取项目文件中指定的SDK名称。例如,对于使用<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">的项目,该属性的值就是Microsoft.NET.Sdk.WindowsDesktop。
规范配置TargetFramework
利用这个内置属性替代命名规则判断,修改Directory.Build.props中的配置如下:
<Choose> <When Condition="'$(MSBuildProjectSdkName)' == 'Microsoft.NET.Sdk.WindowsDesktop'"> <PropertyGroup> <TargetFrameworks>net7.0-windows</TargetFrameworks> </PropertyGroup> </When> <Otherwise> <PropertyGroup> <TargetFrameworks>net7.0</TargetFrameworks> </PropertyGroup> </Otherwise> </Choose>
这样就能精准识别WPF项目,无需依赖命名规则,配置更规范可靠。
内容的提问来源于stack exchange,提问作者howardButcher
相关产品推荐
相关产品推荐

