同一模块在 .net 核心上的 AppDomain 中加载了两次

Same module loaded twice in AppDomain on .net core

我在 .net 核心和框架中都有代码 运行。 大意是我通过反射调用DLL中的方法。 为此,我首先创建一个程序集,然后调用其中的一个方法。 实际逻辑是我需要相当复杂,但最重要的是,在 .net 核心上,同一个模块被加载到当前应用程序域中两次,而在框架上,它不是。

这是一个示例:

Assembly assembly = Assembly.LoadFile(pathToMyDll) //<--- Line 1
AppDomain.CurrentDomain.Load(assembly.GetName()); //<-- Line 2

现在我知道你永远不应该这样做,但如果你这样做,.net framework 将只包含当前 AppDomain 中程序集的一个副本,而 .net core 将包含两个完全相同的程序集。一个在第 1 行之后创建,另一个在第 2 行之后创建。 第二次调用第 2 行没有任何作用。 为什么会这样?为什么要在核心上以这种方式将两个程序集加载到 AppDomain 中?

测试是使用 .net core 3.1 和 framework 4.7.2 完成的。

谢谢。

我为此在微软开了一张票。 他们回答了框架和核心在这方面的行为差异。 这是 git 问题,以防对其他人有所帮助:https://github.com/dotnet/runtime/issues/39783

派对迟到了,但是嘿:

https://docs.microsoft.com/en-us/dotnet/api/system.appdomain?view=netcore-3.1

Note

On .NET Core, the AppDomain implementation is limited by design and does not provide isolation, unloading, or security boundaries. For .NET Core, there is exactly one AppDomain. Isolation and unloading are provided through AssemblyLoadContext. Security boundaries should be provided by process boundaries and appropriate remoting techniques.