我想从我的程序集中获取所有类型,但我没有引用,也不关心它们。查找接口类型与引用有什么关系?我有办法解决这个问题吗?
Assembly assembly = Assembly.LoadFrom(myAssemblyPath);
Type[] typeArray = assembly.GetTypes();
抛出: FileNotFoundException异常 无法加载文件或程序集“某些引用的程序集”或其依赖项之一。系统找不到指定的文件。
答案 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;