我的应用程序从.NET应用程序的代码结构生成图表。 Assembly.LoadFile
有效,但前提是我的应用程序与我正在加载的程序集放在同一个文件夹中(似乎是由于引用的程序集);如果它不在同一个文件夹中,如果加载的程序集中的依赖项不在GAC中,我会收到ReflectionTypeLoadException
异常。
我尝试使用Assembly.ReflectionOnlyLoadFrom
代替。
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += ResolveAssembly;
Assembly loadedAssembly = Assembly.ReflectionOnlyLoadFrom(FileName);
有以下事件:
Assembly ResolveAssembly(object sender, ResolveEventArgs args){
return Assembly.ReflectionOnlyLoad(args.Name);
}
但仅ResolveAssembly
,System
和System.Windows.Forms
才调用System.Drawing
。它没有被调用OpenTK.dll
,OpenTK.GLControl.dll
和其他引用的程序集。当我拨打ReflectionTypeLoadException
时,它也投了loadedAssembly.GetTypes()
。
如何让它加载引用的程序集,以便我不必强制将我的应用程序放在与其检查的程序集相同的文件夹中?
更新
当我致电Assembly.ReflectionOnlyLoadFrom
时,我可以使用GetReferencedAssemblies()
来观察该程序集中的引用。当我检查AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies()
时,我注意到只加载了一个程序集(最初指定的程序集)。换句话说,引用的程序集根本没有加载(尽管ReflectionOnlyAssemblyResolve
挂钩)。
答案 0 :(得分:0)
您可以尝试的第一件事就是处理AppDomain.CurrentDomain.AssemblyResolve
事件并自行解决。
我可能考虑的第二件事是将bin / probe-path设置为目标目录,产生第二个AppDomain
,并基本上重新定位AppDomain
内的工作。
但是,我还要认真考虑使用独立的加载器,即没有绑定到.NET运行时的所有。在一些类似的工作中(检查与app本身并不真正相关的程序集 - 只是为了获取信息等)我大量使用了IKVM.Reflection.dll,它允许你创建一个单独的Universe
- 它具有与常规反射相同的基本API,但坦率地说,它不会变得混乱(加上它允许您为其他目标平台加载程序集,这很方便)。