System.MissingMethodException: 方法未找到?

326

之前工作的asp.net webforms应用程序现在抛出此错误:

System.MissingMethodException:找不到方法

该类中有一个名为DoThis的方法,应该可以正常工作。

我有一个通用处理程序,如下所示:

public class MyHandler: IHttpHandler
{
    public void Processrequest(HttpContext context)
    {
      // throws error now System.MissingMethodException: 
      // Method not found.
      this.DoThis(); 
    }

    public void DoThis(){ ... }
}

你能发一些更多的代码吗?因为这段代码是无效的。 - mironych
3
somepage是什么?正如“sound”所指出的,这个代码是不正确的。请给我们提供一个完整的代码片段来展示这个问题。 - user47589
如果您在本地计算机上运行时遇到此错误,请尝试在web.config中将optimizeCompilations键设置为false并重新编译。 - Taraz
36个回答

486

这是一个问题,当旧版本的DLL仍然存在时可能会出现。确保最新的程序集已经部署并且没有重复的旧程序集隐藏在某些文件夹中。您最好删除每个构建项并重新构建/部署整个解决方案。


74
请确保旧版本没有在全局程序集缓存(GAC)中。 - ladenedge
7
如果你不幸需要使用一个依赖于其他库,而这些库又依赖于其他库的情况,那么请确保使用相同版本的dll(在我的情况下是NHibernate)来清理/重建所有依赖的库。 - Serj Sagan
2
升级项目的.NET目标框架也可以修复错误。我正在升级一个针对.NET 4.5的MVC4 / Web API 1项目。在升级所有MVC,Web API和Entity Framework依赖项后,我遇到了相同的错误;将目标框架更改为.NET 4.5.1使错误消失。 - Lukas S.
33
调试时打开“调试”->“窗口”->“模块”窗口可以帮助查看程序集从哪里加载。 - JamesD
3
我曾多次因GAC问题受挫,这可以通过我在过去某个时候已经给@ladenedge的评论点赞来证明,当我再次“发现”这个答案时。 - rory.ap
显示剩余8条评论

57

⚠️ 错误的Nuget包版本 ⚠️

我有一个单元测试项目,它正在导入我们公司内部的EF Nuget数据访问包,并且 那段代码 引入了 一个版本远远落后于当前版本的外部包。

问题是顶层包的Nuget设置被设为使用最低版本,而下一层的/旧版本赢得了胜利,并在操作期间使用了它...

因此,它悄悄地获取了错误的版本,用于包和应用程序都使用的通用程序集。


解决方案

通过将Nuget中的软件包设置/更新为使用并获取[最新版本],解决了这个问题。


1
这对我有用。管理解决方案的软件包没有起作用,但我必须逐个更新每个项目。 - aoakeson
1
我的单元测试项目引用了比我的实际项目更新的版本。 - Rhyous
是的,我在一个解决方案中有两个项目引用了同一个模型,但每个项目使用的NuGet包都不同。 - FernandoG

28

我通过在服务器上安装正确的 .NET Framework 版本解决了这个问题。网站正在运行 4.0 版本,而它调用的程序集是针对 4.5 编译的。安装了 .NET Framework 4.5 并将网站升级到 4.5 后,一切正常运作。


2
.NET 3.5编译目标与安装的.NET 3存在一些问题。我真的很惊讶为什么启动时没有更基本的警告... - Martin Meeser
对于 .NET Framework 版本 > 4.0,您需要指定库存保留单位 (SKU),它表示应用程序针对的 .NET Framework 版本。https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/startup/supportedruntime-element - bgcode

24

对我来说,重新启动Visual Studio实际上解决了这个问题。 我认为这是由于旧的组件文件仍在使用,执行“清除构建”或重新启动VS应该可以解决它。


9

检查你的引用!

确保在你的解决方案项目中,始终指向相同的第三方库(不要仅仅信任版本号,还要查看路径)。

例如,如果你在一个项目中使用iTextSharp v.1.00.101,而在其他地方使用NuGet或引用了iTextSharp v1.00.102,那么你将会遇到这些运行时错误,这些错误会影响你的代码。

我把所有3个项目中的iTextSharp引用都改成了指向同一个DLL,然后一切正常了。


对我来说,清理项目并再次删除和添加一些引用是有效的。 - Honza P.
这在VS 2017中尤其成为一个问题,因为它经常会提示你添加引用,而该引用的源路径设置为解决方案中另一个项目的输出文件夹,而不是引用程序集的输出文件夹。 - Mr. TA

6
此外,尝试“清理”您的项目或解决方案,并进行重新构建!

5

我曾遇到这种情况,文件是在同一个程序集中引用的,而不是单独的dll。当我将该文件从项目中排除,然后再次包含它时,一切都正常了。


5
我在一个.NET MVC项目中遇到了这个问题。根本原因是NuGet软件包的版本冲突。我的解决方案有几个项目,每个项目都有一些NuGet软件包。在一个项目中,我有Enterprise Library Semantic Logging软件包的一个版本,在另外两个项目中(引用第一个项目),我有同样软件包的旧版本。所有内容都编译没有错误,但是当我尝试使用该软件包时,会出现神秘的“找不到方法”错误。
解决方法是从两个项目中删除旧的NuGet软件包,只在实际需要它的一个项目中包含它。(同时我还进行了整个解决方案的清洁重建。)

4

如果使用自己的NuGet服务器进行开发,请确保程序集版本都相同:

[assembly: AssemblyVersion("0.2.6")]
[assembly: AssemblyFileVersion("0.2.6")]
[assembly: AssemblyInformationalVersion("0.2.6")]

我应该如何检查它? - SerG
我认为在nupkg中。 - sennett

3

我刚遇到了这个问题,原来是因为我在 UI 项目中引用了 DLL 的旧版本。因此,在编译时它很满意。但是在运行时,它使用的是 DLL 的旧版本。

在假定需要重建/清理/重新部署解决方案之前,请检查所有其他项目的引用。


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