0

我的应用程序从 .NET 应用程序的代码结构生成图表。Assembly.LoadFile有效,但前提是我的应用程序已与我正在加载的程序集放在同一文件夹中(似乎是由于引用的程序集);如果它不在同一个文件夹中,ReflectionTypeLoadException如果加载的程序集的依赖项不在 GAC 中,则会出现异常。

我试过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.dllOpenTK.GLControl.dll以及其他引用的程序集。ReflectionTypeLoadException当我打电话时它也抛出了一个loadedAssembly.GetTypes()

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

更新:

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

4

1 回答 1

0

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

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

但是,我也会认真考虑使用独立加载程序,即根本不绑定到 .NET 运行。在一些类似的工作中(检查与应用程序本身并不真正相关的程序集 - 只是为了提供信息等)我大量使用 IKVM.Reflection.dll,它允许您创建一个单独的Universe- 它具有相同的基本 API作为常规反射,但坦率地说,它并没有那么混乱(另外它允许您为其他目标平台加载程序集,这很方便)。

于 2013-05-07T08:57:40.403 回答