阻止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.ReflectionOnlyLoad()
,它看起来不加载依赖项。不确定它是否会返回引用该依赖项的类型,因为我以前从未尝试过这样做。
现在是2022年了,.NET 6也在这里,所以上面提到的解决方案正式过时了。
以下是一个新的解决方案:https://github.com/dotnet/corefxlab/blob/master/docs/specs/typeloader.md
显然,这是一个存档的实验存储库,因此您必须手动将代码嵌入到项目中。注意许可证。