7

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

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

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

4

4 回答 4

5

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

要加载程序集以明确反映它的目的,您需要使用 eg将其加载到仅反射上下文ReflectionOnlyLoadFrom中。这也不需要加载任何引用的程序集,但是您无法运行代码,并且反射有时会变得比您习惯的更尴尬。

于 2011-11-10T00:07:00.597 回答
3

它似乎是仅在程序集中定义的 Get Types的副本,解决方案是:

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;    
}
于 2014-02-12T09:03:15.377 回答
0

为了加载程序集,有必要加载程序集的依赖项。例如,如果您的程序集包含返回 an 的类型,XmlNode那么您将不得不加载System.Xml.dll

于 2011-11-10T00:06:29.607 回答
0

使用仅反射上下文的替代方法可能是Jb Evain的 Mono.Cecil,它也可以通过 NuGet获得。

ModuleDefinition module = ModuleDefinition.ReadModule(myAssemblyPath);
Collection<TypeDefinition> types = module.Types;
于 2015-03-04T04:47:21.517 回答