如何仅在工具支持的情况下有条件地构建 .Net Core 3.0?

How do I conditionally build .Net Core 3.0 only if supported by tooling?

我想使用 TargetFrameworks .csproj 元素将 .Net Core 3.0 (netcoreapp3.0) 和 .Net Framework 4.8 (net48) 作为控制台应用程序的多目标,如下所示:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFrameworks>netcoreapp3.0;net48</TargetFrameworks>
        <AssemblyName>MyConsoleApp</AssemblyName>
    </PropertyGroup>
</Project>

但是,我希望同一个 .csproj 文件在旧工具中正常降级,并在工具不支持 netcoreapp3.0(例如Visual Studio 2017).

看了条件编译的文档,好像只说编译时改设置,没有说要不要先编译。

我怎样才能做到这一点?

I reviewed the conditional compilation documentation, but it seems to talk only about changing settings when compiling, not whether to do the compilation in the first place.

是的,msbuild conditions 应该在 <Project> 节点内工作。根据您的要求,我只能想象一种可能的方式,将 conditions 添加到第一个 PropertyGroupCondition="'$(VisualStudioVersion)'=='16.0'"),类似于这种格式:

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

  <PropertyGroup Condition="'$(VisualStudioVersion)'=='16.0'">
    <OutputType>Exe</OutputType>
    <TargetFrameworks>netcoreapp3.0;net48</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup Condition="'$(VisualStudioVersion)'!='16.0'">
    <OutputType>Exe</OutputType>
    <TargetFramework>net48</TargetFramework>
  </PropertyGroup>

  <!-- ... other PropertyGroup with conditions-->

  <!--I use this script to confirm that when building the project in VS2017(msbuild15.0),the VS version is 15.0 while in VS2019(msbuild16.0), VS version is 16.0-->
  <Target Name="TestVersion" AfterTargets="build">
    <Message Text="version=>$(VisualStudioVersion)" Importance="high"/>
  </Target>
</Project>

不得不说,大多数时候,我们对 class 库项目而不是控制台项目使用多目标,不确定您这样做的具体原因...希望它能有所帮助 :)

更新:

在未安装VS的情况下构建.net项目,可以考虑使用Build Tools for VS package,这里是build tools for VS2019的link(包含msbuild 16.0)。在 All downloads=>Tools for VS2019 中我们可以找到构建工具包。

为确保我们可以使用此包中的 msbuild.exe 构建 .net framework4.8 和 .net core3.0 控制台项目,请确保我们在安装时启用了这些工作负载和组件:

我们可以导航至 Individual Components 以确保启用 .net core 3.0 和 .net 4.8。