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

时间:2016-08-17 10:17:41

标签: c# system.reflection

我们在不同的文件夹中有两倍相同的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()方法,我想在这种情况下,结果应该严格相同?

由于

1 个答案:

答案 0 :(得分:1)

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