.NET Framework 4.7.2 应用程序能在运行时加载 .NET Core 5.0 库的 DLL 吗?

3
我正在将一些NET Framework 4.7.2类库迁移到NET Core 5.0。主机框架应用程序可以动态发现并运行 NET Core 库上的 "Assembly.Load",但是当我尝试在已加载的程序集上执行 "Assembly.GetType(NET50Namespace.Classname)" 操作时,它会失败并返回 null,并显示错误信息如下:
{"Could not load file or assembly 'System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.":"System.Runtime, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}
看起来它似乎正在尝试加载NET Core 5.0.0.0运行时,而我已经安装了它。我使用控制台命令 "dotnet -list-runtimes" 进行了检查,NETCore和WindowsDesktop运行时都已成功安装。
c> dotnet --list-runtimes

Microsoft.NETCore.App 5.0.0 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 5.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 3.1.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 3.1.10 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 5.0.0 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 5.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

我卡住了。

Q1. Framework 4.7.2应用程序是否可以动态加载和运行NETCore 5.0 DLL,这合法/可能吗?我尝试将我的应用程序的一小部分移植到NET50作为第一步。但是它并不起作用,我可能在试图做不可能的事情。

Q2. 如果Framework可以加载/调用NET50 DLL,我做错了什么,我如何使GetType调用工作,以便我可以实例化和调用NET50类库?

谢谢。


5
你能把类库改成.NET Standard吗? - mjwills
您无法将 .NET 5 程序集加载到 .NET Framework 进程中。 - Lasse V. Karlsen
一个.NET Framework 4.7.2应用程序最多可以加载.NET Standard 2.0程序集,因此我建议您将其作为类库的目标,而不是.NET 5。在此处查看完整的兼容性列表-https://learn.microsoft.com/en-us/dotnet/standard/net-standard - Lasse V. Karlsen
感谢大家的帮助。我认为我可以轻松地针对NET Standard 2程序集进行目标设置,因为我的库没有做任何特殊处理。至少这将使我开始将代码从NET Framework移动到NET Core。我会进行实验。我只是不想一次性解决整个移植问题,所以想先开始针对NET 5.0进行目标设置。 - Kevin
2个回答

4

“不行”

从根本上讲,这不是一个受支持的场景,并且.NET Framework和.NET Core之间有着明显的区别(实质上.NET 5就是.NET Core)。

如果可以的话,.NET 4.7.2“有点支持”.NET Standard 2.0,并且.NET 5也正确地实现了它,所以如果你的库可以针对.NET Standard 2.0进行目标设置,那么它可能会被.NET 5和.NET Framework 4.7.2应用程序都加载。你还可以使用多个TFM来为库进行多重定向,例如net472net5.0(也许还要加一些netstandard

然而,老实说:继续使用.NET Framework将变得越来越困难;如果可能的话,你应该优先考虑迁移到更高版本的.NET(例如写作时的.NET Core 3.1或.NET 5)。


2
谢谢你的回答。你是正确的,我正试图通过开始逐步移动代码片段而不是一次性打破整个应用程序来避免“越来越难”的部分。我将尝试针对并加载NET Standard 2程序集,因为我的库没有做任何特殊处理。至少这样可以让我开始将代码从.NET Framework迁移到.NET Core。我会进行实验。我只是不想一次性解决整个移植问题,所以我随意选择了NET 5.0。 - Kevin

0
还有一件事需要记住。如果您已经安装了 Microsoft .NET SDK 6 或 7,那么无论您的目标框架是什么(在您的情况下是 5.0),dotnet publish 总是会使用最新版本的 SDK。这可能会导致意外的问题,因为现在您拥有不兼容的 dll 或者甚至是您不需要的 dll。尝试创建一个 global.json 文件来指示您在发布期间想要使用的 SDK。 https://learn.microsoft.com/en-us/dotnet/core/versions/selection

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