在我们的应用程序(包含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检查它们时,组件没有任何错误(显然)。
此时,我真的迷路了,不知道如何解决这个问题。
感谢任何帮助。
由于
答案 0 :(得分:6)
回答我自己的问题:
当抛出异常时,我上升了堆栈跟踪并列出了在创建的子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后,一切正常。
多么愚蠢的问题......
答案 1 :(得分:1)
在调试时,我添加了一个异常,当抛出异常时,我打开了Modules窗口(Debug Menu - > Windows - > Modules,或者[Ctrl + D,M]),然后我意识到我的代码使用的是来自我所期望的不同位置的DLL,我用新的DLL替换了旧的DLL,然后就可以了。
答案 2 :(得分:0)
我刚刚遇到了类似的问题,我在Microsoft.AspNet.Identity.Core中创建了UserManager类的接口(用于通过Unity进行依赖注入)。在单元测试中,即使我的应用程序正确编译,我也验证了Unity注册并遇到此异常。
结果是我正在测试的项目,单元测试项目安装了其他版本的Microsoft.AspNet.Identity.Core(可通过NuGet包管理器查看)