无法为反射加载引用的程序集

本文关键字:引用 程序集 加载 反射 | 更新日期: 2023-09-27 18:12:38

我的应用程序从。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.FormsSystem.Drawing调用。OpenTK.dll, OpenTK.GLControl.dll和其他引用程序集没有被调用。当我调用loadedAssembly.GetTypes()时,它也抛出了一个ReflectionTypeLoadException

我怎样才能让它加载引用的程序集,这样我就不必强制我的应用程序与它检查的程序集放在同一个文件夹中?

更新:

当我调用Assembly.ReflectionOnlyLoadFrom时,我可以使用GetReferencedAssemblies()来观察该程序集的引用。当我检查AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies()时,我注意到只加载了一个程序集(最初指定的那个程序集)。换句话说,引用的程序集只是没有被加载(尽管有ReflectionOnlyAssemblyResolve钩子)。

无法为反射加载引用的程序集

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

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

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