首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# Assembly.Load vs Assembly.ReflectionOnlyLoad

C# Assembly.Load vs Assembly.ReflectionOnlyLoad
EN

Stack Overflow用户
提问于 2008-11-20 16:08:39
回答 5查看 34.9K关注 0票数 49

我试图理解Assembly.Load和Assembly.ReflectionOnlyLoad之间的区别。

在下面的代码中,我试图查找给定程序集中从给定接口继承的所有对象:

代码语言:javascript
复制
var myTypes = new List<Type>();

var assembly = Assembly.Load("MyProject.Components");

foreach (var type in assembly.GetTypes())
{
   if (type.GetInterfaces().Contains(typeof(ISuperInterface)))
   {
      myTypes.Add(type);
   }
}

这段代码对我来说很好,但我正在对其他可能更好的替代方案进行一些研究,并遇到了Assembly.ReflectionOnlyLoad()方法。

我假设,由于我没有加载或执行任何对象,基本上只是查询它们的定义,我可以使用ReflectionOnlyLoad稍微提高性能……

但是,当我将Assembly.Load更改为Assembly.ReflectionOnlyLoad时,当它调用assembly.GetTypes()时会出现以下错误:

System.Reflection.ReflectionTypeLoadException: 无法加载一个或多个请求类型。检索LoaderExceptions属性以获得更多信息。

我以为上面的代码只是在进行反射和“查看”库.但是,这是海森堡不确定性原理的一个例子吗?看看库及其中的对象,实际上是试图以某种方式实例化它们吗?

谢谢,麦克斯

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-11-20 17:14:51

根据乔恩的回答,了解LoaderExceptions中的内容是有帮助的。代替这些信息,我想我可以冒险猜一猜。来自MSDN

如果程序集有依赖项,则ReflectionOnlyLoad方法不会加载它们。如果您需要检查它们,您必须自己加载它们。

您需要将一个处理程序附加到AppDomain.ReflectionOnlyAssemblyResolve,以帮助CLR加载正在加载的程序集的任何依赖项。你做过这个吗?

票数 28
EN

Stack Overflow用户

发布于 2008-11-20 20:02:54

ReflectionOnly方法是您可以在磁盘上加载特定程序集以检查的唯一方法,而无需经过通常的Load/LoadFrom规则。例如,您可以加载基于磁盘的程序集,其标识与GAC中的标识相同。如果您尝试使用LoadFrom或LoadFile,则始终加载GAC程序集。

此外,您不能调用GetCustomAttributes(.)在返回程序集实例上,因为这将尝试实例化程序集中的属性,即ReflectionOnly。为此,必须使用CustomAttributeData类的静态方法。

不能实例化通过ReflectionOnly加载的程序集中的任何类型。

票数 11
EN

Stack Overflow用户

发布于 2008-11-20 18:12:16

我相信你们对Load和ReflectionOnlyLoad之间区别的总体理解是正确的。这里的问题(我认为)是,即使只是加载一个类型,CLR也需要从定义类型本身的程序集中读取元数据,以及从定义类型祖先的每个程序集中加载元数据。因此,您需要对定义正在加载的类型的祖先类型的所有程序集调用Assembly.ReflectionOnlyLoad。

为了给出一个例子,假设您在程序集A.dll中定义了以下类。

代码语言:javascript
复制
public class MyBase
{
   public void Foo() { }
}

以及在程序集B.dll中定义的以下类。

代码语言:javascript
复制
public class MySubclass : MyBase
{
}

在程序集Assembly.GetTypes上调用B.dll时,CLR将尝试加载MySubclass类型及其所有成员。因为Foo方法是在MyBase中在程序集A.dll中定义的(并且在B.dll的元数据中不存在),所以如果没有加载程序集A.dll,则CLR将引发类型加载异常。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/305835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档