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

时间:2016-11-14 08:29:41

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

在我们的应用程序(包含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检查它们时,组件没有任何错误(显然)。

此时,我真的迷路了,不知道如何解决这个问题。

感谢任何帮助。

由于

3 个答案:

答案 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包管理器查看)