MSBuild 如何检测 .NET Core 的版本?
How can MSBuild detect the version of .NET Core?
在 MSBuild 项目文件(例如,*.csproj)中,我可以通过检查 MSBuildRuntimeType
来检测它是使用 .NET Core 还是 .NET Framework 或 Mono 属性:'$(MSBuildRuntimeType)'!='Core'
。以类似的方式,我可以检测到什么版本的 .NET Core(例如,2.1
、2.2
、3.0
、3.1
)吗?
你可以这样获取:
System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription.ToString();
这将return这样的版本。
.NET Core 3.1.0
您可以像这样在 MSBuild 中分配 属性:
<MSBuildRuntimeVersion>$([System.Runtime.InteropServices.RuntimeInformation]:: FrameworkDescription.ToString())</MSBuildRuntimeVersion>
更新:
根据@minhee 的评论,我了解到上述解决方案不适用于 .NET Core 2.2 或旧版本。我对此做了一些研究,发现这是 CoreFx 中的一个重大变化,其中 APIs that report version is now reporting product and not file version.
这个东西是在 .NET Core 3.0 中引入的,我不知道,因为我没有使用 .NET Core 2.2 或更早的版本。
话虽如此,我想提出另一个适用于所有版本的 .NET Core 的解决方案。
Assembly.GetEntryAssembly().GetCustomAttribute<TargetFrameworkAttribute>().FrameworkName;
在这里,您将获得如下版本号。
.NETCoreApp,Version=v3.0
我已经在控制台应用程序中使用以下版本测试了此代码。
.NET Core 2.0
.NET Core 2.1
.NET Core 2.2
.NET Core 3.0
.NET Core 3.1
在 MSBuild 中:
您也可以在 MSBuild 中检查相同的内容。
例如,在下面的.csproj文件中,我根据目标框架的条件定义了两个消息任务。因此,如果我将目标框架构建为 netcoreapp2.2
的项目,那么它将在构建日志中打印 "Happy 2020..." 并且如果我将目标框架构建为 netcoreapp3.0
然后它将在构建日志中打印 "Happy New Year..."。
<Project Sdk="Microsoft.NET.Sdk">
<Target Name="FooName" BeforeTargets="Build" Condition="'$(TargetFrameworkVersion)'=='v3.0'">
<Message Text="Happy New Year..." Importance="High" />
</Target>
<Target Name="FooName" BeforeTargets="Build" Condition="'$(TargetFrameworkVersion)'=='v2.2'">
<Message Text="Happy 2020..." Importance="High" />
</Target>
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<RootNamespace>New_folder</RootNamespace>
</PropertyGroup>
</Project>
因此,您可以使用 TargetFrameworkVersion
属性 检测 MSBuild 中的当前 .NET Core 版本。
希望对您有所帮助。
在 MSBuild 项目文件(例如,*.csproj)中,我可以通过检查 MSBuildRuntimeType
来检测它是使用 .NET Core 还是 .NET Framework 或 Mono 属性:'$(MSBuildRuntimeType)'!='Core'
。以类似的方式,我可以检测到什么版本的 .NET Core(例如,2.1
、2.2
、3.0
、3.1
)吗?
你可以这样获取:
System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription.ToString();
这将return这样的版本。
.NET Core 3.1.0
您可以像这样在 MSBuild 中分配 属性:
<MSBuildRuntimeVersion>$([System.Runtime.InteropServices.RuntimeInformation]:: FrameworkDescription.ToString())</MSBuildRuntimeVersion>
更新:
根据@minhee 的评论,我了解到上述解决方案不适用于 .NET Core 2.2 或旧版本。我对此做了一些研究,发现这是 CoreFx 中的一个重大变化,其中 APIs that report version is now reporting product and not file version.
这个东西是在 .NET Core 3.0 中引入的,我不知道,因为我没有使用 .NET Core 2.2 或更早的版本。
话虽如此,我想提出另一个适用于所有版本的 .NET Core 的解决方案。
Assembly.GetEntryAssembly().GetCustomAttribute<TargetFrameworkAttribute>().FrameworkName;
在这里,您将获得如下版本号。
.NETCoreApp,Version=v3.0
我已经在控制台应用程序中使用以下版本测试了此代码。
.NET Core 2.0
.NET Core 2.1
.NET Core 2.2
.NET Core 3.0
.NET Core 3.1
在 MSBuild 中:
您也可以在 MSBuild 中检查相同的内容。
例如,在下面的.csproj文件中,我根据目标框架的条件定义了两个消息任务。因此,如果我将目标框架构建为 netcoreapp2.2
的项目,那么它将在构建日志中打印 "Happy 2020..." 并且如果我将目标框架构建为 netcoreapp3.0
然后它将在构建日志中打印 "Happy New Year..."。
<Project Sdk="Microsoft.NET.Sdk">
<Target Name="FooName" BeforeTargets="Build" Condition="'$(TargetFrameworkVersion)'=='v3.0'">
<Message Text="Happy New Year..." Importance="High" />
</Target>
<Target Name="FooName" BeforeTargets="Build" Condition="'$(TargetFrameworkVersion)'=='v2.2'">
<Message Text="Happy 2020..." Importance="High" />
</Target>
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<RootNamespace>New_folder</RootNamespace>
</PropertyGroup>
</Project>
因此,您可以使用 TargetFrameworkVersion
属性 检测 MSBuild 中的当前 .NET Core 版本。
希望对您有所帮助。