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

evp*_*vpo 4 .net c# reflection

我有程序集 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);
}
Run Code Online (Sandbox Code Playgroud)

如何防止 B 被加载?我希望 GetTypes() 像 B 不可用一样运行,并且只返回可用类型和 null 表示不可用,以便我可以执行 ex.Types.where(x=>x!=null);

我想在调用 Assembly.GetTypes() 时使用How to prevent ReflectionTypeLoadException 中的技巧

这样我只能得到不依赖于 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);
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我阻止了加载 B 并使用了独立于 B 的 A 类型。

nat*_*lez 6

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