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