Assembly.GetTypes()抛出exception

程序集GetTypes()在幕后做什么? 假设已经将一个程序集加载到AppDomain ,它还需要从物理DLL中读取吗? 汇编清单的作用是什么?

通过这样的程序集迭代:

 AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()) 

我偶尔会收到以下错误:

  Could not load file or assembly 

这告诉我,因为程序集被加载到AppDomain它不一定完全加载到内存中。 有时它仍然需要返回文件。

我的问题:

  1. 它为什么这样做?
  2. 如何检测这些半负载组件?

从程序集中获取类型可能需要加载其他程序集,这很可能是导致错误的原因; 无法加载依赖程序集。 但是,.NET程序集可能是由不同文件中的几个模块构成的,所以我相信如果你有一个多文件程序集并且一个或多个文件丢失或损坏,你也可能会遇到这个问题。

与错误相关联,您应该获得有关无法加载的特定程序集的更多信息。

如果您只想加载程序集中的可加载类型列表,可以使用如下扩展方法:

 public static IEnumerable GetLoadableTypes(this Assembly assembly) { if (assembly == null) throw new ArgumentNullException(nameof(assembly)); try { return assembly.GetTypes(); } catch (ReflectionTypeLoadException e) { return e.Types.Where(t => t != null); } } 

(来源: 获取assembly中的所有类型 )

在幕后,GetType方法返回存储在指定对象的类型对象指针成员中的地址(当对象存储在堆中时,此信息与其他几个像Sync Block Index一起存储)。 这就是GetType方法返回任何对象的真实类型的方式。 程序集可能依赖于必须加载的其他程序集。 除非应用程序要求它,否则JIT不会加载它。 所以,是的,它要求程序集始终在物理上可用。