首次创建项目时,建议创建一个 .NET Standard 类库,因为它与最广泛的使用项目兼容。 默认情况下,使用 .NET Standard 向 .NET 库添加 跨平台支持 。 但是,在某些情况下,可能还需要包含面向特定框架的代码。 本文介绍如何为 SDK 样式 项目执行此作。
对于 SDK 样式的项目,可以在项目文件中配置对多个目标框架(TFM)的支持,然后使用 dotnet pack 或 msbuild /t:pack 创建包。
注释
nuget.exe CLI 不支持打包 SDK 样式的项目,因此应仅使用 dotnet pack 或 msbuild /t:pack。 建议改为在项目文件中包括通常包含在文件.nuspec。 若要以非 SDK 样式项目中的多个 .NET Framework 版本为目标,请参阅 支持多个 .NET Framework 版本。
创建支持多个 .NET Framework 版本的项目
在 Visual Studio 中创建新的 .NET Standard 类库或使用
dotnet new classlib。建议创建一个 .NET Standard 类库,以获得最佳兼容性。
编辑 .csproj 文件以支持目标框架。 例如,更改
<TargetFramework>netstandard2.0</TargetFramework>to:
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>请确保将 XML 元素从单数更改为复数(将“s”添加到打开和关闭标记)。
如果你有任何仅在一个 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 } }将任何您希望的 NuGet 元数据作为 MSBuild 属性添加到 .csproj 文件中。
有关可用包元数据和 MSBuild 属性名称的列表,请参阅 包目标。 另请参阅 控制依赖项资产。
如果要将与生成相关的属性与 NuGet 元数据分开,可以使用其他
PropertyGroup属性,或者将 NuGet 属性放在另一个文件中,并使用 MSBuild 的Import指令来包含它。Directory.Build.Props并且Directory.Build.Targets从 MSBuild 15.0 开始也受支持。现在,使用
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>