Assembly.GetTypes()抛出异常(Assembly.GetTypes() throwi

2019-07-30 22:23发布

什么总成GetTypes()做幕后? 假设一个组件已经加载到AppDomain它仍然需要从物理DLL读? 什么程序集清单呢?

通过这样的组装迭代:

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

我偶尔会收到以下错误:

 Could not load file or assembly 

它告诉我,因为组件加载到AppDomain它并不一定完全加载到内存中。 有时,它仍然需要回到文件。

我的问题:

  1. 为什么这样做?
  2. 我能做些什么来检测这些半加载的程序集?

Answer 1:

从一个组件获取一个类型可能需要额外的组件被加载,使得最可能的错误的原因; 失败加载依赖组件。 但是.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);
    }
}

(来源: 获取所有类型在大会 )



Answer 2:

在幕后,GetType方法的返回存储在特定对象的类型的对象指针构件的地址(当对象被存储在堆,该信息与其他几个像同步块索引一起被存储)。 这是GetType方法如何返回真正的类型的任何对象。 一种组件,可能依赖于必须加载一些其他组件。 除非它是由应用程序所需的,它不会被加载JIT。 所以,是的,它需要的组件在物理上随时可用。



文章来源: Assembly.GetTypes() throwing an exception