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

C# 为什么Assembly.GetTypes()需要引用?,c#,reflection,types,system.reflection,C#,Reflection,Types,System.reflection,我想从程序集中获取所有类型,但我没有引用,也不关心它们。查找接口类型与引用有什么关系?有没有办法让我绕过这件事 Assembly assembly = Assembly.LoadFrom(myAssemblyPath); Type[] typeArray = assembly.GetTypes(); 抛出: FileNotFoundException 无法加载文件或程序集“某些引用的程序集”或其某个依赖项。系统找不到指定的文件。要加载程序集,必须加载程序集的依赖项。例如,如果程序集包含返回Xm

我想从程序集中获取所有类型,但我没有引用,也不关心它们。查找接口类型与引用有什么关系?有没有办法让我绕过这件事

Assembly assembly = Assembly.LoadFrom(myAssemblyPath);
Type[] typeArray = assembly.GetTypes();
抛出: FileNotFoundException
无法加载文件或程序集“某些引用的程序集”或其某个依赖项。系统找不到指定的文件。

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

加载程序集还需要加载其所有依赖项,因为加载程序集后可以执行程序集中的代码(你实际上不运行任何东西,只是对它进行反思并不重要)


要加载程序集以便对其进行反射,您需要使用。例如,这不需要加载任何引用的程序集,但这样您就无法运行代码,反射有时会比您习惯的情况更加棘手。

它似乎是一个副本,解决方案是:

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

使用仅反射上下文的另一种替代方法可能是使用Jb Evain,在其中也可以使用

moduledefinitionmodule=ModuleDefinition.ReadModule(myAssemblyPath);
集合类型=模块类型;

听起来不错,但后来我发现:无法解析对程序集“refAssmbly”的依赖关系,因为它尚未预加载。当使用ReflectionOnly API时,依赖程序集必须通过ReflectionOnlyAssemblyResolve事件预加载或按需加载。我基本上只想看看它,那么为什么引用需要重新加载已解决?@competable\u tech这是文件路径。
ModuleDefinition module = ModuleDefinition.ReadModule(myAssemblyPath);
Collection<TypeDefinition> types = module.Types;