我有程序集A引用程序集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不可用,只返回可用的类型,并且null不可用,所以我可以执行
ex.Types.where(x=>x!=null);
我想使用How to prevent ReflectionTypeLoadException when calling Assembly.GetTypes()
中的技巧这样我只能获得不依赖于B的类型并使用它们。
更新
我在反射和正常情境中加载了A.我使用反射上下文A来调用GetTypes()。从反射上下文程序集中获取类型后,我遇到了另一个问题。当我调用Type.GetCustomAttributes()时,我收到了以下异常
反映通过类型加载的自定义属性是非法的 ReflectionOnlyGetType(参见Assembly.ReflectionOnly) - 使用 改为CustomAttributeData。
我通过从普通的上下文汇编中获取相同的类型来解决它。
//... code omited for brevity
Type reflectionType = reflectionAssembly.GetTypes()[0];
//... code omited for brevity
Type goodType = normalAssembly.GetType(reflectionType.FullName);
这样我就防止从A独立于B加载B和使用的类型。
答案 0 :(得分:2)
查看使用Assembly.ReflectionOnlyLoad()
看起来不加载依赖项。不确定它是否会返回引用该依赖关系的类型,因为我之前没有尝试过。