以 .NET Core 为目标时引用旧的(完整的 .NET Framework)Class 库

Referencing old (full .NET Framework) Class Library when targeting .NET Core

我正在 .Net Core 上开发 Web 应用程序,但由于 .Net Core 仍在开发中,因此使用的一些库尚未构建在 Core 上。

我知道我可以在我的应用程序中以 .Net 4.6 为目标来使用旧库,但我不确定在我的应用程序中使用新的 .Net Core 功能实际发生了什么变化。

我知道这样我会失去多平台功能,但实际上我现在并不需要它 insead 我需要继续使用 API 和 MVC 统一管道、集成依赖 Ingnection 容器和其他.Net Core 新功能

这是否可以通过针对旧框架来实现?

是的,这是可能的。 我有一个针对 NHibernate 的项目(依赖于完整的 .NET Framework)和一些旧格式 Class 库项目 (csproj)。

我使用 DI 和 MVC/API 没问题。

简短的回答是:您不能在 .NET Core 项目中引用 .NET Framework 4.x 库,原因很简单,因为它是两个不同的框架和许多 API在 .NET 4.5/4.6 中可用在 .NET Core 中不可用。

不过也有一些例外。

  1. 如果您的 class 库确实以 portable-net45-win8 为目标,您可以使用它。

    因为此配置文件确保 API 表面与 .NET Core 使用的表面匹配并且基于 System.Runtime。为了能够在 .NET Core 应用程序或 .NET Core class 库中导入此类 packages/libraries,您需要添加

    "frameworks:" {
      "netcoreapp1.0": {
        "dependencies : { },
        "imports": [ "dotnet5.6", "portable-net45-win8" ] 
      }      
    }
    
  2. 如果你的class库目标是dnx5x/dotnet5.x,那么它们可以像上面一样使用

  3. 如果您真的确定,您的 class 库不会使用 ANY 不受支持的 API 和 none 它的依赖项使用 ANY 不受支持 API

    那么你可以在技术上使用相同的技巧,但我建议 永远不要 这样做,因为它允许你导入任何 .NET 4.x 库(甚至 2.0 的),你永远不会知道它是否受支持。 所以不要这样做永远.

    相反,将您的 class 库转换为可移植 Class 库和目标 netstandard1.x(取决于之前使用的 .NET Framework 版本,参见此 matrix) .

    例如,如果您的 class 库之前以 .NET Framework 4.5.1 为目标,则将其转换为 netstandard1.2。如果有任何关于缺少 API 的错误,那么它使用的是 .NET Core 不支持的 API。您必须修复该问题(使用 #if !NETSTANDARD1_2 预编译器指令将其从 netstandard1.2 版本中删除或尝试更高的网络标准版本。您还可以在新的 project.json absed Class 图书馆.