没有使用reflection的运行时C#“找不到方法”exception

我遇到上述exception的问题。 我有一个相对简单的结构,分为两个dll。

第一个包含IEntityService,IEntity,具有基本实现。 第二个包含实际的实现以及接口。 所以有一个IMachine服务实现IEntityService和MachineService,它实现了IEntityService和EntityService。 类似的情况发生在Result集合(实体加服务)上。 此外,服务(机器和结果)是部分类/接口,其中一个类是自动生成的。

现在在其中一个ResultMachine中我试图获得一台机器,如果它不存在,我正在创建它并保存。 但是,当我尝试保存时,尝试从EntityService类访问保存方法时,我得到了“找不到方法”。 但是,如果我在MachineService中包装EntityService.Save方法,它可以正常工作。

编辑:

代码不是必需的。 决议是重新链接参考。 什么误导我,我的dll不在GAC中,它与VS有关。 更重要的是它没有强烈签名,唯一的区别是版本号。

我的第一直觉是检查以确保程序集包含缺少方法的类。 我想有可能assembly没有立即更新?

我们有几次出现此错误,您可以按如下方式重新创建问题:

  • 使用2个dll创建项目(比如一个程序dll和一个测试dll)
  • 将程序dll部署到GAC
  • 添加新方法
  • 创建测试以测试新方法
  • 构建解决方案
  • 运行测试(不在调试模式下)

您现在将获得缺少exception的方法。 原因是它正在使用GAC中的旧版本的dll并且没有该方法。

有时它使用旧版dll的缓存版本,IISreset可以提供帮助。

在您的情况下检查任何旧版本的DLL。

从不同的程序集引用“相同”类型时,请确保通过相同的路径加载所有内容。 否则,实际上可以将相同类型视为不同。

有关更多内容,请参阅此文章: Fusion Loader上下文 – 无法转换“Whatever”类型的对象以键入“Whatever”

当我进入并调整我的构建设置以输出到/ bin / Debug而不是仅仅/ bin时,当我还使用IIS从dev文件夹托管站点时,这发生在我身上。

在我的情况下,您需要将二进制文件放在与服务相同的文件夹中,并在bin文件夹中调整左侧旧版本,并将后续版本放入/ bin / Debug文件夹(和/ bin / Release)。

保持设置不变并进行后构建操作以将位复制到一个级别,具有不同的IIS应用程序以进行调试/发布,或者完全部署到另一个文件夹。 后者可能是最“正确的”但是出于我的目的,我只是在轮转之后意识到,我在服务的文件夹中有不同的版本。 HTH。

在我的情况下,我刚刚部署在装有.NET 3.0(Windows XP)的机器上,而编译目标是.NET 3.5。

此错误消息实际上没有帮助。

问题一直是从System.Runtime.Serialisation使用DataContract。