【问题标题】:Calling a .Net Framework 4 (or Mono) assembly from a .Net Core application从 .Net Core 应用程序调用 .Net Framework 4(或 Mono)程序集
【发布时间】:2017-07-31 19:56:57
【问题描述】:

我有一个简单的 .Net Core Console 应用程序,在同一个解决方案中引用了一个 .Net Framework 4.6.2 项目。当我构建时,我收到以下错误:

错误 CS0012:“对象”类型在未引用的程序集中定义。您必须添加对程序集 '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 .net-core visual-studio-2017


    【解决方案1】:

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

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

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

    .net core classlibrary calling .net framework class library

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

    当您的通用代码与平台无关时,以及对于平台特定代码可以被分解的可重用库,可移植类库非常有用。

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

    【讨论】:

    • 我实际上对共享代码并不感兴趣(尽管我的测试可能暗示了这一点)。我想从 .Net Core 应用程序调用 .Net Framework 程序集。我仍在寻找这个问题的答案:Is there some way to reference a .Net Framework 4.6 (or Mono) assembly (or P/Invoke it) from a .Net Core application?
    • 你看到我链接的文章了吗?
    • 是的,我当然看到了,他们的解决方案是共享代码,这不是我感兴趣的。
    【解决方案2】:

    在 .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 构建。仅当您的库所需的 API 不受 .NET Standard 支持时,您才应该这样做。这与@VMAtm 的答案大致相同,但您可以在 VS 2017 中使用单个 .csproj 来完成。

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

    【讨论】:

    • 我在您提供的关于从 .Net 核心引用 .Net Framework 程序集的链接中没有看到任何提及。如果我忽略了它,你能具体指出吗?此外,目前有什么方法可以从 .Net Core 应用程序 P/Invoke(或等效).Net Framework 程序集。 (假设我只有 .Net Framework 程序集的二进制文件)?
    • 上面的 .NET Standard 链接链接到 introducing net standard blog。在那篇帖子this compatibility shim provides a bridge that enables you to convert your libraries to .NET Standard without having to give up referencing existing libraries that haven’t been converted yet. 不,没有办法在 .NET Core 1.1 上加载/运行该 .NET Framework 程序集,因为 .NET Core 1.1 中没有“兼容性填充程序”。
    • “好消息是,计​​划于今年晚些时候发布的 .NET Core 2.0 将支持您尝试做的事情。”我在路线图中没有看到任何声称将在 2.0 中添加此功能的内容。你能引用一个来源吗?编辑:没关系,我现在看到了。
    • @Verax Core 2.0 是否解决了您的问题?我确实浏览了路线图,但并不清楚它是否声称 Core 2.0 中包含此功能。能否请您也指出来?
    • @Verax 看来,即使在迄今为止的最新版本中,您仍然无法做到这一点:.NET Core 2.2.1 解释为here
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2016-10-04
    • 2021-02-24
    • 1970-01-01
    相关资源
    最近更新 更多