首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止Assembly.GetTypes()加载依赖项

防止Assembly.GetTypes()加载依赖项
EN

Stack Overflow用户
提问于 2012-02-07 00:31:39
回答 2查看 3.8K关注 0票数 5

我有一个引用程序集B的程序集。它们位于同一个目录中。

代码语言:javascript
复制
Type[] types = null;
try
{
  Assembly a = Assembly.Load("A.dll");
  types = a.GetTypes(); // loads B implicitly.
}
catch(ReflectionTypeLoadException ex)
{
  types = ex.Types.Where(x=>x!=null);
}

如何防止B被装载?我希望GetTypes()在B不可用的情况下运行,只返回可用类型和空值,以便执行ex.Types.where(x=>x!=null);

我想用如何在调用ReflectionTypeLoadException ()时防止Assembly.GetTypes的技巧

通过这种方式,我只能获得不依赖于B的类型,并使用它们。

更新:

我在反射和正常上下文中加载了A。我使用反射上下文A来调用GetTypes()。在从反射上下文程序集中获取类型之后,我遇到了另一个问题。当我调用Type.GetCustomAttributes()时,收到了以下异常

对通过ReflectionOnlyGetType加载的Type的自定义属性进行反思是非法的(参见Assembly.ReflectionOnly) --使用CustomAttributeData代替。

我通过从普通上下文程序集中获取相同类型来解决这个问题。

代码语言:javascript
复制
//... code omited for brevity
Type reflectionType = reflectionAssembly.GetTypes()[0];
//... code omited for brevity
Type goodType = normalAssembly.GetType(reflectionType.FullName);

这样,我就避免了B的加载,并且使用了从A独立于B的类型。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-07 02:42:35

看看如何使用Assembly.ReflectionOnlyLoad(),它看起来不需要加载依赖项。不确定它是否会返回引用该依赖项的类型,因为我以前没有尝试过这样做。

票数 8
EN

Stack Overflow用户

发布于 2022-02-11 15:07:36

它是2022年,.NET 6在这里,所以上面提到的解决方案正式过时了。

下面是一个新的解决方案:https://github.com/dotnet/corefxlab/blob/master/docs/specs/typeloader.md

显然,这是一个归档的试验性存储库,因此您必须手动将代码嵌入到您的项目中。请注意许可证。

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

https://stackoverflow.com/questions/9169440

复制
相关文章

相似问题

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