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

本文关键字:加载 依赖 Assembly GetTypes 阻止 | 更新日期: 2023-09-27 18:23:38

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

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);

我想在调用Assembly.GetTypes()时使用"如何防止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);

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

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

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

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

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

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