支持项目文件中的多个 .NET Framework 版本

首次创建项目时,建议创建一个 .NET Standard 类库,因为它与最广泛的使用项目兼容。 默认情况下,使用 .NET Standard 向 .NET 库添加 跨平台支持 。 但是,在某些情况下,可能还需要包含面向特定框架的代码。 本文介绍如何为 SDK 样式 项目执行此作。

对于 SDK 样式的项目,可以在项目文件中配置对多个目标框架(TFM)的支持,然后使用 dotnet packmsbuild /t:pack 创建包。

注释

nuget.exe CLI 不支持打包 SDK 样式的项目,因此应仅使用 dotnet packmsbuild /t:pack。 建议改为在项目文件中包括通常包含在文件.nuspec。 若要以非 SDK 样式项目中的多个 .NET Framework 版本为目标,请参阅 支持多个 .NET Framework 版本

创建支持多个 .NET Framework 版本的项目

  1. 在 Visual Studio 中创建新的 .NET Standard 类库或使用 dotnet new classlib

    建议创建一个 .NET Standard 类库,以获得最佳兼容性。

  2. 编辑 .csproj 文件以支持目标框架。 例如,更改

    <TargetFramework>netstandard2.0</TargetFramework>

    to:

    <TargetFrameworks>netstandard2.0;net45</TargetFrameworks>

    请确保将 XML 元素从单数更改为复数(将“s”添加到打开和关闭标记)。

  3. 如果你有任何仅在一个 TFM 中工作的代码,则可以使用 #if NET45#if NETSTANDARD2_0 分离依赖于 TFM 的代码。 (有关详细信息,请参阅 How to multitarget.)例如,可以使用以下代码:

    public string Platform {
       get {
    #if NET45
          return ".NET Framework"
    #elif NETSTANDARD2_0
          return ".NET Standard"
    #else
    #error This code block does not match csproj TargetFrameworks list
    #endif
       }
    }
    
  4. 将任何您希望的 NuGet 元数据作为 MSBuild 属性添加到 .csproj 文件中。

    有关可用包元数据和 MSBuild 属性名称的列表,请参阅 包目标。 另请参阅 控制依赖项资产

    如果要将与生成相关的属性与 NuGet 元数据分开,可以使用其他 PropertyGroup属性,或者将 NuGet 属性放在另一个文件中,并使用 MSBuild 的 Import 指令来包含它。 Directory.Build.Props 并且 Directory.Build.Targets 从 MSBuild 15.0 开始也受支持。

  5. 现在,使用 dotnet pack 和生成的 .nupkg 可以同时面向 .NET Standard 2.0 和 .NET Framework 4.5。

下面是使用上述步骤和 .NET Core SDK 2.2 生成的 .csproj 文件。

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

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
    <Description>Sample project that targets multiple TFMs</Description>
  </PropertyGroup>

</Project>

另请参阅