AppDomain.CurrentDomain.GetAssemblies 失败并显示 ReflectionTypeLo

本文关键字:显示 ReflectionTypeLo 失败 CurrentDomain GetAssemblies AppDomain | 更新日期: 2023-09-27 18:32:56

在单元测试期间,我遇到了以下代码的问题,该代码要求所有加载的程序集:

var res = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.ToList();

此代码失败,并显示具有模式内部异常的 ReflectionTypeLoadException

无法加载类型 Microsoft.Xml.Serialization.Generated Assembly.FOO

其中FOO是我们编码的一些特定类。

在上述之前运行单元测试时会出现此问题,该单元测试使用 XDocument 类创建 XML 文档。

可能不一定想加载这些代码生成的类(我猜Microsoft.Xml.Serialization.GeneratedAssembly.*是代码生成的。我只是想了解出了什么问题。

AppDomain.CurrentDomain.GetAssemblies 失败并显示 ReflectionTypeLo

您应该检查程序集的IsDynamic字段,该字段在.netframework 4及更高版本中可用。

var res = AppDomain.CurrentDomain.GetAssemblies().Where(ass => ass.IsDynamic == false)
.SelectMany(x => x.GetTypes())
.ToList();

你能打开 Fusion 日志以查看为什么程序集无法加载吗?

如何在 .NET 中启用程序集绑定失败日志记录 (Fusion)

我最终得出结论,为序列化和 xmlserialization(以及其他?)生成的运行时代码类对我来说并不有趣。因此,以下过滤器帮助

return AppDomain.CurrentDomain.GetAssemblies()
.Where(x => !x.FullName.StartsWith("Microsoft.GeneratedCode"))
.SelectMany(x => x.GetTypes())
.ToList();