在 ReflectionOnly 模式下将程序集加载到新的 AppDomain 时,方法没有实现

Method does not have an implementation when loading assemblies into a new AppDomain in ReflectionOnly mode

在我们的应用程序(包含 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.

这里有一些 "fun" 事实:

当我用 ILSpy 和 ILDAsm 检查程序集时,它们没有任何问题(很明显)。

此时,我真的很迷茫,不知道如何处理这个问题。

感谢任何帮助。

谢谢

回答我自己的问题:

当异常被抛出时,我进入堆栈跟踪并列出在创建的子 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 Framework 3.5 的项目中引用了第一个。改成4.0后一切正常

多么愚蠢的问题...

在调试时,我添加了一个异常,当异常被抛出时,我打开了模块 window(调试菜单 --> Windows --> 模块,或 [Ctrl + D, M]), 然后我意识到我的代码使用的是来自我期望的不同地方的 DLL,我用新的 DLL 替换了那个旧的 DLL 然后它工作了。

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

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