c# - 如何创建同时面向 .NET 2.0 和 .NET Standard 的库?

标签 c# .net asp.net-core .net-core .net-standard

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

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

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

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

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

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

最佳答案

如果您依赖 Microsoft.AspNetCore.* 包,则不能,因为支持 .NET 标准的绝对最低要求是 .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.WebUtilities(有关依赖项,请参阅 NuGet page)它在这两个

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

关于c# - 如何创建同时面向 .NET 2.0 和 .NET Standard 的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41408448/

相关文章:

c# - 获取第一次异常的行号

c# - Entity Framework 中的 OrderBy 虚拟属性

C# - DLLImport 和函数默认值

c# - C#中的图像边框操作

asp.net - 将 ASP.net Core 2.0 部署到 Azure

iis - HTTP 错误 403.14 - 禁止 asp.net 5 和 MVC 6 iis10

c# - 避免在双链场景下指定key列

c# - 使用 LINQ 根据条件将集合拆分为多个部分?

azure - 在azure应用程序服务部署中推送单个文件更改

c# - 如何使用 C# 在 Ubuntu 上获取 GPU 信息?