我有一个引用程序集B的程序集。它们位于同一个目录中。
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代替。
我通过从普通上下文程序集中获取相同类型来解决这个问题。
//... code omited for brevity
Type reflectionType = reflectionAssembly.GetTypes()[0];
//... code omited for brevity
Type goodType = normalAssembly.GetType(reflectionType.FullName);这样,我就避免了B的加载,并且使用了从A独立于B的类型。
发布于 2012-02-07 02:42:35
看看如何使用Assembly.ReflectionOnlyLoad(),它看起来不需要加载依赖项。不确定它是否会返回引用该依赖项的类型,因为我以前没有尝试过这样做。
发布于 2022-02-11 15:07:36
它是2022年,.NET 6在这里,所以上面提到的解决方案正式过时了。
下面是一个新的解决方案:https://github.com/dotnet/corefxlab/blob/master/docs/specs/typeloader.md
显然,这是一个归档的试验性存储库,因此您必须手动将代码嵌入到您的项目中。请注意许可证。
https://stackoverflow.com/questions/9169440
复制相似问题