Assembly.ReflectionOnlyLoadFrom(assemblyPath).GetName() VS Assembly.LoadFrom(assemblyPath).GetName()

Assembly.ReflectionOnlyLoadFrom(assemblyPath).GetName() VS Assembly.LoadFrom(assemblyPath).GetName()

我们在不同的文件夹中有两次相同的 dll。

当我们使用

加载第二个dll时
Assembly.ReflectionOnlyLoadFrom(assemblyPath)

我们收到一个错误:

"API restriction: The assembly 'file.dll' has already loaded from a different location. It cannot be loaded from a new location within the same appdomain."

这是可以理解的,但是当我们这样做时:

Assembly.LoadFrom(assemblyPath);

它工作正常。

为什么?使用 "ReflectionOnly" 方法会改变什么。

在我们的例子中,唯一的用法是对结果使用 GetName() 方法,我想在这种情况下,结果应该完全相同?

谢谢

当您加载 ReflectionOnly 的程序集时,只会加载元数据。这允许您检查其类型,但不能实例化或执行它们中的任何一个。

还有一个property indicating whether an assembly was loaded for reflection only

因此,对于 AppDomain,一个程序集只能加载一次:完全加载或仅用于反射。鉴于它已经完全加载,您不能再次加载它以进行反射。

Assembly.LoadFrom() 的调用,即使提供了两个不同的路径,也只会加载同一个程序集一次,只要它们在版本上匹配。另见 Side effects of calling Assembly.Load multiple times

另请参阅:MSDN: How to: Load Assemblies into the Reflection-Only Context