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

Kar*_*ták 4 .net c# appdomain assembly.reflectiononly .net-assembly

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

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

问题在于,加载程序(贷给Sacha Barber)无法加载带有

System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

以下是一些“有趣”的事实:

  • 方法BeforeLoad是虚拟的,并且是接口方法的实现
  • 上周,加载程序异常表明不同的方法没有实现(该方法不是虚拟的),后来,当我明确实现该方法时,消息提示找不到该方法。
  • 上周,程序集的目标框架AppBaseCore是.NET 3.5,并且3个程序集无法加载
  • 现在程序集的目标框架AppBaseCore是.NET 4和5程序集加载失败
  • 否则应用程序一切都很好

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

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

任何帮助表示赞赏。

谢谢

Kar*_*ták 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}
Run Code Online (Sandbox Code Playgroud)

并注意到两个版本的System.Data程序集。该方法的参数类型为System.Data.IDbTransaction

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

多么愚蠢的问题...