如何创建面向 .NET 2.0 和 .NET Standard 的库?

Posted

技术标签:

【中文标题】如何创建面向 .NET 2.0 和 .NET Standard 的库?【英文标题】:How to create a library that targets both .NET 2.0 and .NET Standard? 【发布时间】:2017-05-15 11:24:53 【问题描述】:

我有一个当前支持 .NET 2.0+ 的 small library。

我不使用更高版本框架的任何功能,因此保留 2.0 支持会很好,但我也想针对 .NET Core(或更准确地说,.NET Standard)。

我尝试将这两个框架都添加到project.json

"frameworks": 
  "net20": ,
  "netstandard1.6": 
    "imports": "dnxcore50"
  

但我的库需要在 .NET Standard 上运行的 NuGet 包(System.ReflectionMicrosoft.AspNetCore.WebUtilities)与 .NET 2.0 不兼容。

如何在不维护两个完全独立且代码几乎相同的项目的情况下解决此问题?

【问题讨论】:

问题是,如果您想使用最低要求为 4.5.1 / netstandard 1.3 (=.NET Framework 4.6) 的包,您需要 .NET Framework 2.0 支持什么?您想将它与旧版 ASP.NET 4 一起使用吗?如果不是,那么如果依赖于 ASP.NET Core,则没有理由将目标定为这么低,因为 ASP.NET Core 不会在低于 4.5 或 4.5.1 的任何设备上运行 【参考方案1】:

如果您依赖 Microsoft.AspNetCore.* 包作为支持 .NET Standard 的绝对最低要求是 .NET 4.5,则您不能。

.NET 4.5 是第一个包含 .NET Core 所基于的System.Runtime 的版本。但细细想来,也说不通。如果您需要在您的库中支持 ASP.NET Core。

如果您的库应该为 ASP.NET Core 和 ASP.NET 4(即 MVC 5、WebApi 2)运行,那么您将需要有条件地使用 ASP.NET 依赖项并使用 #if 预处理器指令。

"frameworks": 
  "net20": 
    "dependencies": 
      "NameOf.AspNetLegacyPackage": "1.2.3"
    
  ,
  "netstandard1.3": 
    "dependencies": 
      "Microsoft.AspNetCore.WebUtilities" : "1.1.0"
    ,
    "imports": "dnxcore50"
  

我使用了netstandard1.3,因为这是Microsoft.AspNetCore.WebUtilities 的最低要求,但根据您的其他依赖项,您可能需要更高或更低。

NameOf.AspNetLegacyPackage 是包的名称,它包含与您需要的 Microsoft.AspNetCore.WebUtilities 相同的功能,但适用于 .NET Framework 2.0(如果有)。如果不是,您必须将其删除并自己编写替换函数。

然后在你的代码中使用

#if NETSTANDARD1_3
    // Code or APIs which is only available in netstandard1.3/net4.6 
    // this includes the Microsoft.AspNetCore.WebUtillities
#else
    // Use code or API which runs under .NET Framework 2.0
#endif

或者,如果您打算放弃对 .NET Framework 2.0 的支持并转而使用 4.5.1,则可以在两者中继续使用 Microsoft.AspNetCore.WebUtillities(有关依赖项,请参阅 NuGet page)

"dependencies": 
  "Microsoft.AspNetCore.WebUtilities" : "1.1.0"
,
"frameworks": 
  "net451": 
  ,
  "netstandard1.3": 
    "imports": "dnxcore50"
  

【讨论】:

【参考方案2】:

您可以通过将代码放入共享项目中来做到这一点,然后创建一个面向 .Net 2.0 的类库,以及另一个面向 NetStandard 的类库项目。如果 2.0 或 Netstandard 中的某些内容在其他平台中不可用,则可以使用编译器指令为每个内容编写兼容的代码。

【讨论】:

以上是关于如何创建面向 .NET 2.0 和 .NET Standard 的库?的主要内容,如果未能解决你的问题,请参考以下文章

创建本地用户帐户 c# 和 .NET 2.0

如何在新创建的 .NET Core 2.0 Web 应用程序中定位 .NET Standard 2.0?

如何创建 Web 服务 | ASP.NET 2.0 | C# |网页服务

无法在面向 .Net Standard 2.0 的项目中加载 Revit API

我可以在面向 .Net 3.5 的项目中使用所有 C# 4.0 功能吗?

如何在 .Net Core 2.0 中创建应用程序变量?