我能否在.NET 6项目中添加对.NET Framework DLL的引用?

46

微软最近宣布 .Net 6.0 版本作为重要版本。我没有找到任何参考资料,说明我们可以在 .NET 6.0 项目中使用旧的 .NET Framework (> 4.7.*) 引用?

比如说,一个 .NET 6 项目会有一个 .NET Framework 4.7.1 的 dll 引用来进行 Windows 应用程序开发吗?


2
你可以尝试。有一些支持尝试将.NET Framework程序集加载到.NET Core中。但是,如果.NET Framework程序集执行某些操作或使用.NET Core不支持的内容,则无法运行。如果这些.NET 4.7.1程序集实际上针对.NET Standard <= 2.0,则没问题:它们既可以在.NET Framework上运行,也可以在.NET Core上运行。 - canton7
1
是什么导致您想要这样做?您丢失了源代码吗?还是您只是想要将DLL针对.NET Framework,因为您还有另一个需要在.NET 6应用程序之外使用该DLL的.NET Framework应用程序? - mason
1
@mason,我们已经有一个 .net 4.7.2 的遗留项目,我们需要在 Web API 和现有项目中共享它。 - Jatin Dave
@JatinDave 这似乎是 .NET Standard 的一个很好的使用案例。 - mason
3
可以工作,例如.net5对mscorlib、System、System.Core、System.Configuration、System.Data、System.Drawing、System.Net、System.Numerics、System.Runtime.Serialization、System.Security、System.Web、System.Windows、System.Xml、WindowsBase等都有转发器。它们会透明地将框架类型+程序集映射为等效的.NETCore类型。需要进行非常彻底的测试以确保所有内容都按预期映射,重新编译程序集往往更容易。 - Hans Passant
1
@mason,遗留项目还涉及到C++项目的引用。因此,实际上这是一个混合代码,包含C++和C#项目引用。我不确定将这些项目转换为.NET标准是否有帮助? - Jatin Dave
4个回答

16

问题

使用 .NET Framework(1.0-4.8)编译/面向的程序集可能会使用 .NET Standard 或 .NET Core 中不存在的 API(类型、方法)。

因此,如果您有一个面向 .NET Standard 或 .NET Core 的项目,并且想要引用一个面向 .NET Framework 的程序集,它可能在运行时抛出异常,因为它缺少方法重载或类型。这些类型存在于 Framework DLL 中,但不存在于 .NET Core 运行时程序集中。

如果您知道(通过解释代码或测试,最好两者兼备),面向 Framework 的程序集不使用 .NET Standard 或 .NET Core 中不存在的 API,那么一切都没问题(有关差异,请参见什么是 .NET Core 和 .NET Standard 类库项目类型之间的区别?)。

修复方法(但实际上并非完全修复)

如果它是一个放置在源代码控制的 lib 文件夹中的程序集,您可以添加一个程序集引用:

<Reference Include="../lib/path/To/Dll.dll" />

如果它是一个NuGet包依赖项,您可以安装它并覆盖警告
<PackageReference Include="Some.Framework.Package" Version="1.0.0" NoWarn="NU1701" />

修复(这次是真的)

重新编译程序集以针对 .NET Standard 2.0,并通过 NuGet 进行打包和分发。


8

这是一个复杂答案的问题。

说实话,很可能你的问题的答案是否定的,因为你有一个非常具体的库在脑海中。真正的答案取决于所涉及的库,但很可能大多数情况下不起作用。

是的,你可以将.NET Framework程序集加载到.NET Core 5和6中。

然而,根据该库的功能以及更重要的是其依赖项(即它想要携带的其他库),对于任何规模的复杂库来说,它可能无法正常工作。

在.NET 5+中可能不存在某些类,甚至只是单个方法重载或属性。根据你访问的.NET Framework的确切部分,它在.NET 5+中可能会完全丢失。

这里link1有更多信息。

你最好的选择可能是尝试:

重新编译库以适配您的特定 .NET 版本(无论是 5 还是 6);重新编译库以针对 .NET Standard 2.1,因为 .NET 5+ 兼容该版本。然而,您可能会遇到相同的问题,因为您将不得不处理这些已更改的位。但至少您会更了解哪些能够正常工作,哪些不能,并有机会修复它。如果这不是您要更改的库,请更换它或尽力而为。

4
一般情况下,不行。它们并不是为了兼容而设计的。.NET Core以及随后的.NET 5和6都是基于完全重写的.NET。
也许有些东西可以使用.NET Framework兼容模式工作,但这并不保证。
如果您希望在.NET Framework和.NET Core / 6之间实现可靠的跨框架兼容性,可以尝试将您的库目标定位到.NET Standard。

2
您可以在.NET 6 Core应用程序中调用.NET Framework 4.8 dll。我花了一些时间才弄清楚如何做到这一点,但它是可行的。我创建了控制台和Web .NET 6 Core应用程序,它们调用了一些我的旧版.NET Framework 4.8 dll。该过程如下:
  • 在Visual Studio 2022中创建或打开您的.NET 6 Core解决方案,并将您的旧版.NET Framework 4.8 dll添加到其中。
  • 将您的旧版.NET Framework 4.8 dll添加为顶层.NET 6 Core控制台或Web项目的引用。
  • 通过文件资源管理器从您的顶层项目中删除“obj”和“bin”目录。
  • 从Visual Studio 2022顶部菜单中选择 “Tools > Command Line > Developer Command Prompt”。这将打开一个命令行窗口,当前目录已更改为您的解决方案目录。
  • 在命令窗口中运行“dotnet restore”命令。这将重新创建您的“obj”目录,并将“project.assets.JSON”文件放置到“obj”目录中,该文件将引用您最近添加的.NET Framework 4.8 dll。如果您未执行此操作,则在运行应用程序时会出现运行时错误。 重新构建和重新运行您的应用程序。您的.NET Framework DLL现在应该可以正常加载。

我不确定是否始终需要删除“obj”和“bin”目录,但我发现如果您不删除它们,偶尔会生成“project.assets.JSON”文件不正确,导致运行失败。删除它们,然后重新运行命令即可解决问题。


但是,你如何解决".NET Framework中存在但在.NET中不存在的一些技术"的问题? - Graviton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接