2013-05-07 65 views
0

我的应用程序根据.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只拿到呼吁SystemSystem.Windows.FormsSystem.Drawing。它没有被请求OpenTK.dllOpenTK.GLControl.dll和其他引用的程序集。当我拨打loadedAssembly.GetTypes()时,它也抛出了ReflectionTypeLoadException

我怎样才能让它加载引用的程序集,以便我不必强制将我的应用程序放入与其检查的程序集相同的文件夹中?

更新:

当我打电话Assembly.ReflectionOnlyLoadFrom,我可以用GetReferencedAssemblies()观察从装配的引用。当我检查AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies()时,我注意到只装载了一个组件(最初指定的一个)。换句话说,引用的程序集并不会被加载(尽管挂接了ReflectionOnlyAssemblyResolve)。

+0

也许它们被加载到一个单独的应用程序域? – animaonline 2013-05-07 08:54:49

回答

0

您可以尝试的第一件事就是处理AppDomain.CurrentDomain.AssemblyResolve事件并自行解决它。

我可能会考虑的第二件事情是产生第二个AppDomain,将bin/probe-path设置为目标目录,并且基本上将AppDomain中的工作重新定位。

但是,我也会认真考虑使用一个独立的加载程序,也就是说,它并不与.NET运行库的所有绑定在一起。在一些类似的工作中(检查与应用程序本身无关的程序集 - 仅用于信息等),我大量使用了IKVM.Reflection.dll,它允许您创建一个单独的Universe - 它具有相同的基本API作为常规反射,但坦率地说它不会让人感到困惑(再加上它允许您为其他目标平台加载程序集,这很方便)。

+0

试过(#1和#2),仍然没有运气。总是得到'BadImageFormatException','ReflectionTypeLoadException'或'FileNotFoundException'。然而,当我的应用程序在同一个文件夹中时,它可以工作。这么奇怪。 – 2013-05-07 09:10:45

+0

@史密斯先生,因为我列出了3个选项,这两个选项你试过了吗? – 2013-05-07 09:11:16

+0

当您尝试加载未针对当前框架编译的程序集时,还会引发Mr.Smith'BadImageFormatException'。你检查过了吗? – Fabske 2013-05-07 09:15:21