从 .Net Core 应用程序调用 .Net Framework 4(或 Mono)程序集

Calling a .Net Framework 4 (or Mono) assembly from a .Net Core application

我有一个简单的 .Net Core 控制台应用程序在同一解决方案中引用 .Net Framework 4.6.2 项目。构建时,出现以下错误:

error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.

我是否在尝试做一些不允许的事情?

有什么方法可以从 .Net Core 应用程序引用 .Net Framework 4.6(或 Mono)程序集(或 P/Invoke 它)?

使用 Visual Studio 2017,.Net Core 1.1

.Net Core 和.Net 4.0 有不同的核心库。旧 .Net 库中的类型 System.Objectmscorlib 中定义,显然没有被引用。

如果您引用该库,您可能会遇到名称解析错误,因为相同的类型将在相同的命名空间中定义,并且在不同的库中具有相同的类型名称。所以是的,这是不允许的。

编辑:但是,有一种常见的方法称为 Shared project,您可以阅读它 here。此问题也可能对您有用:

您也可以尝试创建一个可移植的 class 库,它可以从 .Net Core 和 .Net 4.6 库中引用。

Portable class libraries are great when your common code is platform-independent as well as for reusable libraries where the platform-specific code can be factored out.

编辑#2:如@EricErhardt 所述,您可以使用不同的目标重新编译您的 .Net 4.6 库,如果您没有源代码,这可能不是一个选项。

在 .NET Core 1.x 中,您不能引用 .NET Framework 4.6(或 Mono)程序集。 .NET Core 1.x 和 .NET Framework 有 2 次不同 运行 次,它们的类型不会混合 - 正如构建错误消息所说。

相反,您可以做的是重新编译针对“.NET Standard”的 .NET Framework 4.6 程序集。 Read more about .NET Standard。为 .NET Standard 编译库允许该库在 .NET Framework、Mono 或 .NET Core 上 运行。另一种选择是多目标 .NET Framework 4.6 程序集,因此它同时针对 .NET Framework 4.6 和 .NET Core 1.1 构建。只有在 .NET Standard 不支持您的库所需的 API 时,您才应该这样做。这与@VMAtm 的回答大致相同,但您可以在 VS 2017 中使用单个 .csproj 来完成。

好消息是,.NET Core 2.0 将支持您尝试执行的操作,即 slated for release later this year