C#运行时出现“找不到方法”异常,没有使用反射

12

我遇到了一个问题,无法得到上述异常。我的结构相对简单,分为两个dll文件。

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

现在,在ResultMachine中,我正在尝试获取一个machine,如果不存在就创建并保存。然而,在我尝试保存时,当尝试从EntityService类中访问保存方法时,出现“方法未找到”的错误。但是,如果我将EntityService.Save方法包装在MachineService中,则可以正常工作且没有任何异常。

编辑:

不需要提供代码。解决方法是重新链接引用。对我来说具有误导性的是我的dll文件没有在GAC中,而是与VS链接。更重要的是它没有强签名,唯一的区别是版本号。


2
你能发布一下实例化你的“ResultMachine”所用的代码,以及你正在尝试使用的接口和实现吗? - Oded
5个回答

9
我们已经多次遇到这个错误,您可以按照以下步骤重现该问题:
  • 创建包含2个dll的项目(例如程序dll和测试dll)
  • 将程序dll部署到GAC中
  • 添加新方法
  • 创建测试以测试新方法
  • 构建解决方案
  • 运行测试(非调试模式)
您现在会收到方法缺失异常。原因是它正在使用GAC中的旧版本dll,该版本没有该方法。
有时它会使用旧dll的缓存版本,IISreset有助于解决此问题。
在您的情况下,请检查是否存在旧版本的dll。

有时候我也会遇到这个问题,当开发环境持有一个dll的引用时。关闭开发环境然后重新打开它就可以解决这个问题。 - Jay

6

我的第一反应是检查程序集中是否包含缺失方法的类。我想这很有可能是由于程序集没有立即更新造成的。


3

1
当我更改了构建设置以输出到/bin/Debug而不是仅仅是/bin时,这种情况发生在我也使用IIS从开发文件夹托管网站的情况下。您需要将二进制文件放在与服务相同的文件夹中,在我的情况下,调整会在bin文件夹中留下旧版本,并将后续构建放入/bin/Debug文件夹(和/bin/Release)。要么保持当前设置并执行后构建操作以将位复制到上一级,要么为debug/release使用不同的IIS应用程序,要么部署到另一个文件夹中。后者可能是最“正确”的方法,但出于我的目的,我意识到在服务文件夹中有不同的版本时,我只需花费很多时间就能实现它。希望对你有所帮助。

0
在我的情况下,我只是部署在一台安装了.NET 3.0(Windows XP)的机器上,而编译目标是.NET 3.5。
这个错误信息真的没有什么帮助。
问题出在使用了System.Runtime.Serialisation中的DataContract。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接