如何在运行时使用众所周知的属性查找 MSBuild 的构建是 运行 - .NET Core 或 .NET Framework

How to find at runtime with well known properties which build of MSBuild is running - .NET Core or .NET Framework

在自定义构建项目中,可能使用了两种可能的 MSBuild 框架。一个使用 .NET Core 构建,Visual Studio 个 MSBuild 使用 .NET Framework 构建。后者在从 Visual Studio 构建时总是 运行,而前者由命令行构建脚本使用。由于 Visual Studio 是我们的选择 IDE,它目前仅支持 .NET Framework MSBuild,我们不能放弃对它的支持(迁移到纯 .NET Core MSBuild 会破坏 IntelliSense、重构和多个其他 VS 好东西)。

代码库中的一个项目是 C++ vcxproj,它只能在 Windows 上使用 .NET Framework MSBuild 构建,而在其他平台上它使用 make。 C++ 项目是某些 C# 项目的依赖项,应在基于标准 MSBuild 逻辑构建时构建它们。

目前它以下列方式包含在 C# 项目中:

<ProjectReference Condition="$(SolutionFileName) == 'Solution.sln'" Include="nativeproject\nativeproject.vcxproj" />

从 Visual Studio(VS 填充此值)构建项目时,条件始终为真,而在通过在项目级别调用 MSBuild 并单独构建 vcxproj 从构建脚本构建时,我们将其设为假。但是,它没有提供基于 .NET Core 和 .NET Framework MSBuild 之间的条件区分的通用解决方案。

不幸的是,Visual Studio 支持 .NET Core MSBuild 并将用于 vcxproj 构建的世界上最好的仍然很遥远。

How to find at runtime with well known properties which build of MSBuild is running - .NET Core or .NET Framework.

尝试使用 this document 中的 $(MSBuildRuntimeType)

我的测试:

对于 test.csproj,其中有这样的自定义目标:

  <Target Name="Test" AfterTargets="build">
    <Message Text="value is $(MSBuildRuntimeType)" Importance="high"/>
  </Target>

当我使用 msbuild test.csproj(.net fx msbuild, VS 中结果相同)

时,它的值为 Full

当我使用dotnet build test.csproj(.net core SDK中包含的.net core msbuild)

时,它的值为Core

因此,如果您试图获得一个 属性 来确定正在使用哪种 msbuild,它似乎可以满足您的需求。希望对你有帮助,如果有什么不明白的,欢迎指正。