【问题标题】:Method does not have an implementation when loading assemblies into a new AppDomain in ReflectionOnly mode在 ReflectionOnly 模式下将程序集加载到新的 AppDomain 时,方法没有实现
【发布时间】:2017-03-27 20:14:34
【问题描述】:

在我们的应用程序(包含 65 个项目的解决方案)中,所有引用的程序集都在运行时分析是否存在 Ninject 模块(也应用了一些过滤)。这些模块稍后会加载到 Ninject 内核中,并且每个模块都为内核声明绑定。

我们采用了一个加载器,它以仅反射模式将引用的程序集加载到单独的程序集中。与 Ninject 可以从目录加载程序集的方式不同的是,该目录可以包含带有不应加载的模块的程序集。而且一开始,并不是所有引用的程序集都被加载。

问题在于loader(归功于 Sacha Barber)无法使用

加载某些程序集
System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information

LoaderExceptions 一个条目:

Method 'BeforeLoad' in type 'Lekis.AppBase.Core.BLLBaseCore' from assembly 'AppBaseCore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.

这里有一些“有趣”的事实:

  • 方法BeforeLoad是虚拟的,是接口方法的实现
  • 上周加载程序异常说不同的方法没有实现(该方法不是虚拟的),后来,当我明确实现它时,消息说找不到该方法。
  • 上周程序集AppBaseCore 的目标框架是 .NET 3.5,3 个程序集加载失败
  • 现在程序集 AppBaseCore 的目标框架是 .NET 4 和 5 程序集加载失败
  • 除此之外,应用程序一切正常

当我使用 ILSpy 和 ILDAsm 检查程序集时(显然)没有任何问题。

在这一点上,我真的很迷茫,不知道如何解决这个问题。

感谢任何帮助。

谢谢

【问题讨论】:

  • "方法 BeforeLoad 是虚拟的,是接口方法的实现"。是真的吗?检查all the answers here 以确保您没有遇到某种版本控制/加载冲突。 ILSpy/ILDAsm 不会报告任何问题,因为程序集在结构上是有效的。
  • 谢谢,@JeroenMostert。我去看看。

标签: c# .net .net-assembly appdomain assembly.reflectiononly


【解决方案1】:

回答我自己的问题:

当异常被抛出时,我向上堆栈跟踪并列出了在创建的子 AppDomain 中加载的程序集:

AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies()
{System.Reflection.RuntimeAssembly[15]}
...
[13]: {System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089}
[14]: {System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089}

并注意到System.Data 程序集的两个版本。有问题的方法有一个System.Data.IDbTransaction 类型的参数。

第一个在针对 .NET 框架 3.5 的项目中被引用。将其更改为 4.0 后一切正常。

多么愚蠢的问题...

【讨论】:

    【解决方案2】:

    在调试时,我添加了一个异常,当异常被抛出时,我打开了Modules窗口(Debug Menu --> Windows --> Modules,或者[Ctrl + D, M]),然后我实现了我的代码正在使用我期望的不同地方的 DLL,我用新的 DLL 替换了旧的 DLL,然后它就可以工作了。

    【讨论】:

      【解决方案3】:

      我刚刚遇到了类似的问题,我在Microsoft.AspNet.Identity.Core中做了一个UserManager类的接口(通过Unity进行依赖注入)。在单元测试中,我验证了 Unity 注册并遇到了这个异常,即使我的应用程序编译正确。

      原来我正在测试的项目和单元测试项目安装了不同版本的 Microsoft.AspNet.Identity.Core(通过 NuGet 包管理器可见)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-12
        相关资源
        最近更新 更多