5

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

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 检查它们时,这些程序集没有任何问题(显然)。

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

任何帮助表示赞赏。

谢谢

4

3 回答 3

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 后一切正常。

多么愚蠢的问题……

于 2016-11-16T10:25:21.750 回答
2

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

于 2018-05-18T01:40:40.237 回答
0

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

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

于 2018-09-28T15:03:20.473 回答