gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:38:29 24 4
gpt4 key购买 nike

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

我们采用了一个加载器,以仅反射模式将引用的程序集加载到单独的程序集中。与 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是虚拟的,是接口(interface)方法的实现
  • 上周加载程序异常说不同的方法没有实现(那个方法不是虚拟的),后来,当我明确实现它时,消息说找不到方法。
  • 上周程序集 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 后一切正常。

多么愚蠢的问题...

关于c# - 在 ReflectionOnly 模式下将程序集加载到新的 AppDomain 时,方法没有实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40584562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com