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个回答

3

你试过关闭再打开吗?开玩笑的,重新启动我的电脑才真正解决了问题,而且在其他答案中没有提到。


2

在我的情况下,这是一个复制/粘贴问题。我不知道怎么会出现了我的映射配置文件中的私有构造函数:

using AutoMapper;

namespace Your.Namespace
{
    public class MappingProfile : Profile
    {
        MappingProfile()
        {
            CreateMap<Animal, AnimalDto>();
        }
    }
}

请注意构造函数前缺少了"public"关键字,这个问题在编译时不会出现错误。但是,当AutoMapper尝试实例化配置文件时,它会找不到构造函数!

@RenaudGauthier,也许我在Jon Skeet的回答中误读了什么,但他说没有访问修饰符的类是internal,在评论中他明确表示“不是这样。如果您声明一个构造函数并且没有指定可访问性,则它将是private。请参见C#规范的10.3.5节”。所以我想我的构造函数毕竟是私有的?如果我错了,请纠正我。是的,我的回答脱离了上下文,我是从另一个问题转过来的(该问题没有为我提供答案)。我也会在那里添加我的回答链接。 - DaBeSoft
你说得完全正确,不用理我了,我已经删除了无用的评论。 - Renaud Gauthier

2
可能问题出在报告缺失的方法的参数或返回类型上,而这个“缺失”的方法本身是没问题的。
在我的情况下就是这样,这个误导性的信息让我花了很长时间才找到问题所在。原来一个参数的类型的程序集在GAC中有一个旧版本,但由于版本编号方案的更改,这个旧版本实际上具有更高的版本号。将这个旧/较高版本从GAC中移除即可解决问题。

2
使用Costura.Fody 1.6和2.0:
在尝试使用其他潜在的解决方法却毫无成果后,我浪费了大量时间寻找同样类型的错误。最终发现,一个旧版本的DLL被嵌入到了我新编译的.exe文件所在的同一目录中。显然它首先会在本地目录中查找文件,然后再查找其中的嵌入库。删除旧的DLL后问题得以解决。
需要明确的是,问题并不在于我的参考链接指向了一个旧版本的DLL,而是在一个分离的系统上测试我的应用程序时,并且该系统中存在一个旧版本的DLL的副本。

同Costura.Fody 4.1.0版本相同。 - Jack

2
在我的情况下,MissingMethodException是针对同一文件中的一个方法!然而,我刚刚将一个使用.Net Standard2的NuGet包添加到我的4.7.1-targeting项目中,这导致了System.Net.Http的版本冲突(4.7.1:版本4.0.0.0,使用.NET Standard 2的NuGet包需要4.2.0.0)。这似乎是已知的问题,应该在4.7.2中得到改善(请参见注2)。在所有其他项目中,我都使用了类似于这样的绑定重定向,因为它一旦尝试加载我没有的4.2.0.0就会出现异常。
  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
  </dependentAssembly>

除了这个项目,似乎它只在调用使用System.Net.Http.HttpResponseMessage作为参数或返回类型的本地函数时才尝试加载System.Net.Http(在调试期间作为参数,在没有调试器运行测试时作为返回类型,这也有点奇怪)。而且它没有显示无法加载4.2.0.0版本的System.Net.Http的消息,而是返回了此异常。


1
在更新多个 NuGet 包后遇到了此错误。请检查您的 Visual Studio 错误列表(或生成输出)以获取类似以下警告:

在不同版本的同一依赖程序集之间发现冲突。在 Visual Studio 中,双击此警告(或选择它并按 Enter 键)以解决冲突;否则,请将以下绑定重定向添加到应用程序配置文件中的“运行时”节点:
...

在 Visual Studio 中双击此警告会自动调整我的 web.config 文件中各个 bindingRedirect 包版本,并解决了该错误。


1
在我的情况下,我的项目引用了Microsoft.Net.Compilers.2.10.0。当我将其切换到Microsoft.Net.Compilers.2.7.0时,错误消失了。这是一个有着各种原因的神秘错误。

1
在我的情况下,这是一个包含与我的.csproj文件中引用的同名DLL不同版本相同名称的旧DLL的文件夹,尽管路径已经明确给出,但它们仍然被包含在内,因此多个版本的相同DLL存在冲突。

1
我曾遇到过类似的情况,出现了同样的异常。我的web应用程序解决方案中有两个项目,分别命名为DAL和DAL.CustSpec。DAL项目具有名为Method1的方法,但DAL.CustSpec没有这个方法。我的主项目引用了DAL项目,并且还引用了另一个名为AnotherProj的项目。我的主项目调用了Method1。AnotherProj项目引用了DAL.CustSpec项目,而不是DAL项目。生成配置中同时配置了DAL和DAL.CustSpec项目。生成完成后,我的Web应用程序项目在其Bin文件夹中有AnotherProj和DAL程序集。然而,当我运行网站时,网站的Temporary ASP.NET文件夹中的文件却是DAL.CustSpec程序集而不是DAL程序集,原因不明。当然,当我运行调用Method1的部分时,就会收到“找不到方法”的错误。
我需要做的是更改AnotherProj项目中的引用,将其从DAL.CustSpec更改为只有DAL,删除Temporary ASP.NET Files文件夹中的所有文件,然后重新运行网站。之后,一切都开始正常工作。我还确保在构建配置中取消选中DAL.CustSpec项目,以防万一有所帮助。

1

我在我的ASP.NET网站中遇到了同样的情况。我删除了已发布的文件,重新启动了VS,再次清理并重建了项目。在下一次发布后,错误消失了...


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