AppDomain.CurrentDomain.GetAssemblies失败并出现ReflectionTypeLoadException

在unit testing期间,我遇到了以下代码的问题,该代码要求所有已加载的程序集:

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

此代码失败,并且ReflectionTypeLoadException具有模式的内部exception

无法加载类型Microsoft.Xml.Serialization.GeneratedAssembly.FOO

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

在上面运行unit testing之前会出现问题,该unit testing使用XDocument类创建XML文档。

我可能不会想要加载这些代码生成的类(我猜测Microsoft.Xml.Serialization.GeneratedAssembly。*是代码生成的。)我只是想了解什么是错误的。

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

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

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

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

我最后总结说,为序列化和xmlserialization(以及其他?)生成的运行时代码的类对我来说是无趣的。 因此以下filter有所帮助

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