为什么Assembly.GetTypes()需要引用



我想从程序集中获得所有类型,但我没有引用,也不关心它们。查找接口类型与引用有什么关系?有什么办法能让我绕开这个问题吗?

Assembly assembly = Assembly.LoadFrom(myAssemblyPath);
Type[] typeArray = assembly.GetTypes();

扔:FileNotFoundException无法加载文件或程序集"某些引用程序集"或其依赖项之一。系统找不到指定的文件

加载程序集也需要加载它的所有依赖项,因为程序集中的代码可以在加载后执行(实际上不运行任何东西而只是反映它并不重要)。

要加载一个程序集以明确地对其进行反射,您需要将其加载到仅反射的上下文中,例如ReflectionOnlyLoadFrom。这也不需要加载任何引用的程序集,但是这样你就不能运行代码,并且反射变得比你经常使用的更尴尬。

这似乎是仅在程序集中定义的Get类型的副本,其中解决方案是:

public static Type[] GetTypesLoaded(Assembly assembly)
{
    Type[] types;
    try
    {
        types = assembly.GetTypes();
    }
    catch (ReflectionTypeLoadException e)
    {
        types = e.Types.Where(t => t != null).ToArray();
    }
    return types;    
}

为了加载程序集,必须加载程序集的依赖项。例如,如果程序集包含返回XmlNode的类型,则必须加载System.Xml.dll

使用仅反射上下文的另一种选择可能是Mono。Cecil by Jb Evain,也可以通过NuGet下载。

ModuleDefinition module = ModuleDefinition.ReadModule(myAssemblyPath);
Collection<TypeDefinition> types = module.Types;

相关内容

  • 没有找到相关文章

最新更新