MSBuild 如何检测 .NET Core 的版本?

min*_*hee 5 msbuild .net-core

在 MSBuild 项目文件(例如,*.csproj)中,我可以通过检查MSBuildRuntimeType属性来检测它是否使用 .NET Core 或 .NET Framework 或 Mono :'$(MSBuildRuntimeType)'!='Core'. 在类似的方式,我可以检测到.NET的核心是什么版本(例如2.12.23.03.1)是什么呢?

Key*_*iya 8

你可以这样得到它:

System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription.ToString();
Run Code Online (Sandbox Code Playgroud)

这将返回这样的版本。

.NET Core 3.1.0
Run Code Online (Sandbox Code Playgroud)

您可以像这样在 MSBuild 中分配一个属性:

<MSBuildRuntimeVersion>$([System.Runtime.InteropServices.RuntimeInformation]:: FrameworkDescription.ToString())</MSBuildRuntimeVersion>
Run Code Online (Sandbox Code Playgroud)

更新:

根据@minhee 的评论,我了解到上述解决方案不适用于 .NET Core 2.2 或更旧版本。我对此进行了一些研究,发现这是 CoreFx 中的一个重大更改,其中报告版本的 API 现在报告的是产品而不是文件版本。

这个东西是在 .NET Core 3.0 中引入的,我不知道,因为我没有使用 .NET Core 2.2 或更早版本。

话虽如此,我想提出另一种适用于所有 .NET Core 版本的解决方案。

System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription.ToString();
Run Code Online (Sandbox Code Playgroud)

在这里,您将获得如下版本号。

.NETCoreApp,Version=v3.0
Run Code Online (Sandbox Code Playgroud)

我已经在控制台应用程序中使用以下版本测试了此代码。

.NET Core 3.1.0
Run Code Online (Sandbox Code Playgroud)

在 MSBuild 中:

您也可以在 MSBuild 中检查相同的内容。

例如,在下面的 .csproj 文件中,我根据目标框架的条件定义了两个消息任务。所以,如果我建项目与目标框架,netcoreapp2.2然后将打印“快乐2020 ...”在构建日志,如果我有目标框架建设项目作为netcoreapp3.0然后它会打印“新年快乐......”在构建日志。

<MSBuildRuntimeVersion>$([System.Runtime.InteropServices.RuntimeInformation]:: FrameworkDescription.ToString())</MSBuildRuntimeVersion>
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用TargetFrameworkVersion属性来检测 MSBuild 中 .NET Core 的当前版本。

我希望这能帮到您。