2

我想使用 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>

但是,当工具不支持 netcoreapp3.0(例如 Visual Studio 2017)时,我希望相同的 .csproj 文件在旧工具中正常降级并仅编译 .Net Framework 4.8。

我查看了条件编译文档,但似乎只谈论编译更改设置,而不是首先是否进行编译。

我怎样才能做到这一点?

4

1 回答 1

2

我查看了条件编译文档,但似乎只谈论编译时更改设置,而不是首先是否进行编译。

是的,msbuild 条件应该在节点内工作。<Project>对于您的要求,我只能想象一种可能的方式,您将其添加conditions到第一个PropertyGroup( Condition="'$(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>

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

更新:

在没有安装VS的情况下构建.net项目,我们可以考虑使用Build Tools for VS package,这里是VS2019构建工具的链接(包含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 已启用。

于 2019-11-04T08:56:51.473 回答