如何在 MSBuild 中访问 SDK 名称

How to access the SDK name in MSBuild

提问人:howardButcher 提问时间:11/7/2023 最后编辑:howardButcher 更新时间:11/9/2023 访问量:46

问:

我有一个 C# SDK 项目文件:

<Project Sdk="Microsoft.NET.Sdk">
  ...
</Project>

如何获取 SDK 名称作为变量?

使用案例: 我有一个相当大的解决方案,包含 WPF 项目和库项目,我喜欢在文件中配置 TargetFramework。 但是,我必须区分 WPF 项目和非 WPF 项目才能设置正确的 TargetFramework。 我喜欢检查是否被选中。 目前我依赖于一个特定的项目 nomenklatur(名称包含 .Wpf),这是相当骇人听闻的。Directory.Build.propsMicrosoft.NET.Sdk.WindowsDesktop

            <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>
C# .NET WPF MSBuild

评论

1赞 Jonathan Dodds 11/7/2023
项目 SDK 似乎不作为属性或项集合的成员提供。但是,适用于 WPF 的开发工具包似乎定义了一个值为 的属性。您可以测试该属性,而不是测试文件名。Microsoft.NET.Sdk.WindowsDesktop_MicrosoftWindowsDesktopSdkImportedtrue
1赞 howardButcher 11/9/2023
@JonathanDodds 这奏效了!谢谢!。通过:<选择> <When Condition=“'$(_MicrosoftWindowsDesktopSdkImported)' == 'true'”> <PropertyGroup> <TargetFrameworks>net7.0-windows</TargetFrameworks> </PropertyGroup> </When> <Otherwise> <PropertyGroup> <TargetFrameworks>net7.0</TargetFrameworks> </PropertyGroup> </Otherwise> </Choose>
0赞 Jonathan Dodds 11/9/2023
我写了一个答案,其中包含有关如何为其他 SDK 找到类似内容的信息。

答:

1赞 Jonathan Dodds 11/9/2023 #1

Project 元素上的属性创建隐式导入。这也可以通过 Sdk 元素来完成。一个项目可以声明多个 SDK,一个给定的 SDK 可以拉取多个其他 SDK。SDK

项目 SDK 似乎不能作为属性或项集合使用。

但是,SDK 可以定义 SDK 独有的属性或项集合。测试属性或项集合是否为空表明 SDK 已导入。

适用于 WPF 的开发工具包似乎定义了一个值为 的属性。您可以测试该属性,而不是测试文件名。Microsoft.NET.Sdk.WindowsDesktop_MicrosoftWindowsDesktopSdkImportedtrue

查找要测试的内容的两种方法:

  • 检查 .NET 项目 SDK 的源代码。“可用的 SDK”列出了一些 Microsoft 项目 SDK 及其存储库。
  • 在项目文件上运行 -preprocess,并检查输出以查看导入和定义的内容。

评论

0赞 howardButcher 11/10/2023
挽救了我的一周。谢谢!