【问题标题】:Cannot load referenced assemblies for reflection无法加载引用的程序集以进行反射
【发布时间】:2013-05-07 08:44:20
【问题描述】:

我的应用程序从 .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 钩子)。

【问题讨论】:

  • 也许它们被加载到单独的应用程序域中?

标签: c# reflection .net-assembly


【解决方案1】:

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

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

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

【讨论】:

  • 都试过了(#1 和#2),还是不行。总是得到BadImageFormatExceptionReflectionTypeLoadExceptionFileNotFoundException。然而,当我的应用程序在同一个文件夹中时,它可以工作。好奇怪。
  • @Mr.Smith,因为我列出了 3 个选项,您尝试过哪个“两者”?
  • @Mr.Smith BadImageFormatException 在您尝试加载未针对当前框架编译的程序集时也会抛出。你检查了吗?
  • @Fabske 我的应用程序目前为v4.0Any CPU 编译。加载的程序集是v2.0x86。这仍然需要工作,如果放在同一目录中,它确实可以工作(使用Assembly.LoadFile)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 2017-03-05
相关资源
最近更新 更多