【问题标题】:referencing .NET framework 4 dll in .NET core 2.0在 .NET core 2.0 中引用 .NET Framework 4 dll
【发布时间】:2018-10-08 13:08:20
【问题描述】:

我有一些用.Net 框架4.0 编写的dll,当我将它引用到用.NET core 2.0 编写的项目时,我无法运行我的程序。

虽然我的 IDE(与 2017 相比)可以在运行时正确识别从该 dll 导入的对象,但我有以下异常:

System.BadImageFormatException: 'Could not load file or assembly 'A_dotnet_4.0_A, Version=10.0.0.0, Culture=neutral, PublicKeyToken=0ad20d08c672086a'. An attempt was made to load a program with an incorrect format.'

我尝试过:

  1. 将我的设置更改为我在帖子here 中看到的任何 CPU
  2. 试图彻底重建我的项目。

有可能吗?如果是这样,我应该怎么做。 在下面的link 似乎是可能的 - 我只是不明白怎么做。

【问题讨论】:

标签: c# dll .net-core


【解决方案1】:

你不能这样做。

.NET Core 可以引用 .NET Standard DLL
.NET Framework 可以引用 .NET Standard DLL

.NET Core 无法引用 .NET Framework DLL(反之亦然)。

例如,如果您有 .NET 标准项目,则不能引用 .NET Framework .NET Core 框架。
这是一个或另一个。

为了进一步详细说明,我们有一个共享 BusinessLogic 的项目,该项目是一个 .NET Standard 2.0 库。
我们在 .NET Core 2.1 和 .NET Framework 4.7 两个其他项目中引用了该项目。

将 .NET Core 或 .NET Framework 项直接引用到该共享的 .NET Standard 库时会出现问题。

【讨论】:

  • “NET Core 无法引用 .NET Framework DLL(反之亦然)。”似乎不是真的。根据 Green 发布的 Github 链接,您可以从 .NET Core 项目中引用 .NET Framework dll。 AFAIK 它需要是实现 .NET Standard 的 .NET Framework 版本,因此它需要是 .NET Framework 4.5 及更高版本。
  • 在他的链接中的第二条评论:“这是我们希望在即将到来的 VS 更新中实现的功能。计划是让您引用 dll,但取决于 dll,它可能或可能无法正常工作,具体取决于它所依赖的内容。”
  • 第五条评论:“这现在可以通过 .NET Core 2.0 项目实现。”这就是格林正在使用的。
  • @Hypenate 那是在 2017 年 5 月。查看 2017 年 10 月 6 日 上的评论:“这现在可以从 .NET Core 2.0 项目中实现。我将关闭它。预计它可以工作,所以如果你遇到任何问题,请打开一个带有具体细节的新问题。”
  • @nvoigt 正确!我的错。
【解决方案2】:

有可能吗?

不,不是。

  • .NET Core 可以运行针对 .NET Core 本身或 .NET Standard 的程序集
  • .NET Framework 可以运行面向 .NET Framework 本身或 .NET Standard 的程序集

因此,无法将两个分别针对 Full Framework 和 Core 的程序集放在一起。不在核心中,也不在完整框架中。

如果您需要一个双方都可以访问的共享库,则需要以 .NET 标准为目标,以便完整框架和 Core 都可以使用。

【讨论】:

  • .NET Framework 4.5 及更高版本实现了.NET Standard,因此可以正常工作。
  • @Bas 框架不能针对某些东西,只有构建输出可以。
  • 注意,我的意思是“实现”而不是“目标”。
  • 然而,.NET Core 2.0 构建可以引用 .NET Framework 4.5 dll。
  • 这个答案不正确。以下是正确答案:stackoverflow.com/a/62051508/3595459 .NET Core 2.0 中首次添加的功能docs.microsoft.com/en-us/dotnet/core/whats-new/…
【解决方案3】:

总结:

它不起作用,因为该 DLL 的 .NET Framework 版本太低。 .NET Core 2.0 及更高版本支持引用其他 .NET Standard dll(因此 .NET Core 或 .NET Framework,或任何其他未来可能实现 .NET Standard 的库)。

.NET Framework 4.0 不实现 .NET Standard,因此它不生成与 .NET Standard 兼容的 dll:.NET Framework 仅从 4.5 及更高版本开始实现 .NET Standard。因此,如果您能找到为 .NET Framework 4.5 编译的 DLL 版本,理论上它应该可以工作,除非出现一些边缘情况。

【讨论】:

  • 感谢您的帮助,毫无疑问这是一个插入式讨论 - 我还将添加 @CamiloTerevinto 提到的用于文档的表格
  • 不,他可以使用 .NET 4.5 库。他不需要使用实现 .NET Core 项目实现的相同版本的 .NET Standard 的 dll,它只需要实现 .NET Standard 期间。 .NET Standard 版本向后兼容,因此较低版本的 .NET Standard 仍然可以使用。
  • 虽然“它不起作用”是正确的,但您的解决方案也不起作用。 .NET Core 和 .NET Full Framework不能相互引用,它们只能引用自己的框架和 .NET Standard 项目。
  • @Bas 不,不是。 .NET Framework 项目是 .NET Framework 项目。 .NET Standard DLL 可以在 Linux 中使用。 .NET Framework DLL 不能
  • 好吧,如果您的声明是“非常特别选择的完整框架程序集可能在某些系统上被引用并在 .NET Core 中运行”,那么我会说......也许?我不在乎。如果您的主张是“完整框架始终生成始终可以在 .NET Core 下运行的程序集”,那么这是错误的。 Windows 窗体是最简单的例子。
猜你喜欢
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 2018-02-02
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多