在 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" 事实:
- 方法
BeforeLoad
是虚拟的,是一个接口方法的实现
- 上周加载程序异常说不同的方法没有实现(那个方法不是虚拟的),后来,当我明确实现它时,消息说找不到方法。
- 上周程序集
AppBaseCore
的目标框架是 .NET 3.5,3 个程序集加载失败
- 现在程序集
AppBaseCore
的目标框架是 .NET 4 和 5 程序集加载失败
- 否则应用程序一切正常
当我用 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 包管理器可见)
在我们的应用程序(包含 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" 事实:
- 方法
BeforeLoad
是虚拟的,是一个接口方法的实现 - 上周加载程序异常说不同的方法没有实现(那个方法不是虚拟的),后来,当我明确实现它时,消息说找不到方法。
- 上周程序集
AppBaseCore
的目标框架是 .NET 3.5,3 个程序集加载失败 - 现在程序集
AppBaseCore
的目标框架是 .NET 4 和 5 程序集加载失败 - 否则应用程序一切正常
当我用 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 包管理器可见)