Assembly.GetTypes()抛出异常

Alw*_*wyn 15 .net c# reflection

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

通过这样的程序集迭代:

AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()) 
Run Code Online (Sandbox Code Playgroud)

我偶尔会收到以下错误:

 Could not load file or assembly 
Run Code Online (Sandbox Code Playgroud)

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

我的问题:

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

Joã*_*elo 34

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

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

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

public static IEnumerable<Type> 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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