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

时间:2011-11-10 00:02:21

标签: c# reflection types system.reflection

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

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

抛出: FileNotFoundException异常 无法加载文件或程序集“某些引用的程序集”或其依赖项之一。系统找不到指定的文件。

4 个答案:

答案 0 :(得分:4)

加载程序集也需要加载它的所有依赖项,因为程序集中的代码可以在加载后执行(无论你实际上没有运行任何东西,只是只反映它)。< / p>

要加载程序集以明确反映它,您需要load it into the reflection-only context例如ReflectionOnlyLoadFrom。这不需要加载任何引用的程序集,但是你不能运行代码,反射变得比你习惯的那样有点尴尬。

答案 1 :(得分:1)

它似乎是Get Types defined in an assembly only的副本,解决方案是:

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;    
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用仅反射上下文的替代方法可能是Jb Evain的Mono.Cecil,也可以via NuGet

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