System.MissingMethodException:找不到方法?

时间:2011-11-09 00:09:23

标签: c# asp.net dll nuget httphandler

曾经在我的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()
    {
    //
    }
}

35 个答案:

答案 0 :(得分:325)

这是一个问题,当旧版本的DLL仍然在某处挥之不去时会发生这种情况。确保部署了最新的程序集,并且没有重复的旧程序集隐藏在某些文件夹中。您最好的选择是删除每个构建的项目并重建/重新部署整个解决方案。

答案 1 :(得分:23)

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

答案 2 :(得分:20)

重新启动Visual Studio实际上是为我修复的。我认为它是由仍在使用的旧程序集文件引起的,并且正在执行" Clean Build"或者重新启动VS应该修复它。

答案 3 :(得分:15)

错误的Nuget包版本

我有一个单元测试项目,该项目吸引了我们公司的EF Nuget数据访问包,该版本在当前版本后面 way

针对那些其他软件包 least version ,将上述软件包的Nuget设置设置为 O(|V| + |E|)

因此,默默地为相关程序集获得了错误的版本。

<强>解决方案

通过将Nuget中的包设置/更新为 [get]最新的修复了该问题。

答案 4 :(得分:5)

我在同一个程序集中引用的文件中发生了这种情况,而不是单独的dll。一旦我从项目中排除了文件,然后再次将其包含在内,一切正常。

答案 5 :(得分:5)

我刚刚在.NET MVC项目中遇到过这个问题。根本原因是NuGet包的冲突版本。我有几个项目的解决方案。每个项目都有一些NuGet包。在一个项目中,我有一个企业库语义记录包的版本,在另外两个项目(引用第一个)中,我有相同包的旧版本。这一切都编译没有错误,但当我尝试使用包时,它给出了一个神秘的“找不到方法”错误。

修复是从两个项目中删除旧的NuGet包,因此它只包含在实际需要它的一个项目中。 (我也对整个解决方案进行了彻底的重建。)

答案 6 :(得分:4)

检查你的参考文献!

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

例如,如果您在一个项目中使用iTextSharp v.1.00.101,并且您在其他地方NuGet或引用iTextSharp v1.00.102,您将获得这些类型的运行时错误,这些错误会以某种方式渗透到您的代码中。

我在所有3个项目中改变了对iTextSharp的引用,指向相同的DLL,一切正常。

答案 7 :(得分:4)

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

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

答案 8 :(得分:3)

也..尝试“清理”您的项目或解决方案并重新重建!

答案 9 :(得分:2)

我刚刚遇到这个问题,结果是因为我从我的UI项目引用了以前版本的DLL。因此,编译时很开心。但是在运行时它使用的是以前版本的DLL。

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

答案 10 :(得分:1)

你是否尝试过关闭再打开?除了笑话,重启我的电脑实际上是我的伎俩,并没有在任何其他答案中提到。

答案 11 :(得分:1)

在我的情况下,这是一个文件夹,其中的旧DLL与我的.csproj文件中引用的DLL具有相同的名称,尽管该路径已明确给出,但以某种方式包含了它们,因此同一DLL的多个版本存在冲突。

答案 12 :(得分:1)

使用Costura.Fody 1.6&amp; 2.0:
在浪费了大量时间与所有其他可能的解决方案无法解决相同类型的错误之后,我发现我嵌入的DLL的旧版本位于我运行新编译的.exe的同一目录中。显然它首先在同一目录中查找本地文件,然后向内查看其嵌入式库。删除旧的DLL工作正常。

要明确的是,我的引用并没有指向一个旧的DLL,而是一个旧DLL的副本在我正在测试我的应用程序的目录中,它是在一个单独的系统上编译在。

答案 13 :(得分:1)

在我的情况下,这是一个复制/粘贴问题。我不知何故最终得到了我的映射配置文件的PRIVATE构造函数:

using AutoMapper;

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

(注意缺少&#34;公共&#34;在ctor前面)

编译得非常好,但是当AutoMapper尝试实例化配置文件时,它(当然!)找不到构造函数!

答案 14 :(得分:1)

问题还在于报告丢失的方法的参数或返回类型,并且“缺失”方法本身就可以了。

这就是我案件中发生的事情,误导性的消息使得解决问题需要更长的时间。事实证明,参数类型的程序集在GAC中具有旧版本,但由于所使用的版本编号方案发生更改,旧版本实际上具有更高版本号。从GAC中删除旧版/更高版本可解决问题。

答案 15 :(得分:1)

如果问题是由GAC中的程序集的旧版本引起的。
这可以帮助:How to: Remove an Assembly from the Global Assembly Cache

答案 16 :(得分:1)

我有一个类似的场景,我正在抛出同样的异常。我在我的Web应用程序解决方案中有两个项目,例如,为了DAL和DAL.CustSpec而命名。 DAL项目有一个名为Method1的方法,但DAL.CustSpec没有。我的主项目引用了DAL项目,并引用了另一个名为AnotherProj的项目。我的主项目调用了Method1。 AnotherProj项目引用了DAL.CustSpec项目,而不是DAL项目。 Build配置同时配置了DAL和DAL.CustSpec项目。构建完所有内容后,我的Web应用程序项目在其Bin文件夹中具有AnotherProj和DAL程序集。但是,当我运行网站时,由于某种原因,网站的Temporary ASP.NET文件夹在其文件中没有DAL.CustSpec程序集,而不是DAL程序集。当然,当我运行调用Method1的部分时,我收到了“找不到方法”错误。

我必须做的是修复此错误,将AnotherProj项目中的引用从DAL.CustSpec更改为DAL,删除Temporary ASP.NET Files文件夹中的所有文件,然后重新启动网站。在那之后,一切都开始起作用。我还确保通过在Build Configuration中取消选中来构建DAL.CustSpec项目。

我想我会分享这个,以防将来帮助其他人。

答案 17 :(得分:1)

我通过使用我的更改制作搁置集并在我的工作区(https://visualstudiogallery.msdn.microsoft.com/f017b10c-02b4-4d6d-9845-58a06545627f)中运行TFS Power Tools'scorch'来解决这个问题。然后我取消了更改并重新编译了项目。 通过这种方式,您可以清理工作区中可能存在的任何“悬挂方”,并使用新的方式启动。 当然,这需要您使用TFS。

答案 18 :(得分:1)

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

答案 19 :(得分:0)

在我的情况下,MissingMethodException是针对同一文件中的方法的!

但是,我刚刚向目标4.7.1的项目中添加了使用.Net Standard2的NuGet程序包,这导致System.Net.Http(4.7.1:4.0.0.0版本,NuGet程序包)发生版本冲突使用.NET Standard 2要求4.2.0.0)。这似乎是should be better in 4.7.2 (see note 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,而在 调用使用System.Net.Http.HttpResponseMessage作为其参数或返回类型的本地函数(调试期间的参数,在没有调试器的情况下运行测试时返回的类型,也有点奇怪)。它返回此异常,而不是显示无法加载System.Net.Http 4.2.0.0版本的消息。

答案 20 :(得分:0)

为了后代,我使用了azure持久功能/持久任务框架来使用azure函数。事实证明,我在本地安装了过时的Azure函数运行时版本。更新它可以解决它。

答案 21 :(得分:0)

这可能已经提到过了,但是对我来说,问题是该项目引用了2个nuget包,并且每个nuget包都引用了另一个nuget包的不同版本。

所以:

项目-> Nuget A-> Nuget X 1.1

项目-> Nuget B-> Nuget X 1.2

两个版本的Nuget X都具有与Project相同的扩展方法。

当我同时将Nuget A和B都更新为引用相同版本的Nuget X时,错误消失了。

答案 22 :(得分:0)

在更新各种Nuget软件包后遇到此错误。检查您的Visual Studio错误列表(或生成输出)以获取类似于以下内容的警告:

在相同从属的不同版本之间发现冲突 部件。在Visual Studio中,双击此警告(或选择它 然后按Enter键解决冲突;否则,添加以下内容 绑定重定向到应用程序中的“运行时”节点 配置文件:
...

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

答案 23 :(得分:0)

可能的情况是

不匹配的 nuget 汇编版本

问题详情

我们有一个解决方案生成了不止一个 nuget 包。

packageA 1.0 中的类 A

B 包 1.0 中的 B 类

A 指的是 B

所以当 A 和 B 都有更新时,我们必须更新 packageA 和 packageB,但问题是我的团队成员之一没有更新 packageB

现在 PackageA 1.1 仍然依赖于 PackageB 1.0 但 PackageB 没有 Class B 的更新版本

因此无法找到方法

解决方案

将两个软件包移至 +1 版本 在这种情况下,我移动了

包A 1.1 -> 包A 1.2

PackageB 1.0 -> PackageB 1.1

但为了使事情更加对称,可以将两者移动到同一版本

包A 1.1 -> 包A 1.2

PackageB 1.0 -> PackageB 1.2

答案 24 :(得分:0)

就我而言,我的项目引用了Microsoft.Net.Compilers.2.10.0。当我将其切换为Microsoft.Net.Compilers.2.7.0时,错误消失了。如此多种原因造成了多么神秘的错误。

答案 25 :(得分:0)

必须是Microsoft的参考错误。

我清理了所有库,然后对其进行了重建,仍然遇到相同的问题,无法解决。

我所做的只是关闭Visual Studio应用程序,然后再次打开它。做到了。

这样一个简单的问题可能需要花费很长时间才能解决,这很令人沮丧,因为您不会认为会是这样。

答案 26 :(得分:0)

在我的情况下,根本没有代码更改,突然其中一个服务器开始得到这个并且只有这个例外(所有服务器都有相同的代码,但只有一个开始出现问题):

System.MissingMethodException: Method not found: '?'.

堆栈:

Server stack trace: 
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at myAccountSearch.AccountSearch.searchtPhone(searchtPhoneRequest request)
   at myAccountSearch.AccountSearchClient.myAccountSearch.AccountSearch.searchtPhone(searchtPhoneRequest request)
   at myAccountSearch.AccountSearchClient.searchtPhone(String ID, String HashID, searchtPhone Phone1)
   at WS.MyValidation(String AccountNumber, String PhoneNumber)

我认为问题是AppPool已损坏 - 我们每天凌晨3点都会自动进行AppPool回收,问题在凌晨3点开始,然后在第二天凌晨3点结束。

答案 27 :(得分:0)

当方法需要我没有指定的参数

时,我遇到了这个问题

答案 28 :(得分:0)

在我的情况下,spotify.exe使用的是我的web api项目想要在开发机器上使用的相同端口。端口号是4381。

我退出Spotify并且一切运转良好:)

答案 29 :(得分:0)

我有一个测试项目,它引用了另外两个项目,每个项目都引用了同一个dll的不同版本(在不同的位置)。这使编译器感到困惑。

答案 30 :(得分:0)

当我在后台运行了许多有效崩溃的MSBuild进程时,我发生了同样的事情(他们引用了旧版本的代码)。我关闭VS并杀死进程资源管理器中的所有MSBuild进程,然后重新编译。

答案 31 :(得分:0)

我遇到了这个问题,它对我来说是一个项目使用的是List.Sensors命名空间和另一个类型实现了ISensorInfo接口。类Type1SensorInfo,但此类在Example.Sensors.Type1的命名空间中更深一层。当尝试将Type1SensorInfo反序列化到列表中时,它抛出了异常。当我使用Example.Sensors.Type1添加到ISensorInfo接口时,不再有异常!

namespace Example
{
    public class ConfigFile
    {
        public ConfigFile()
        {
            Sensors = new List<ISensorInfo<Int32>>();
        }
        public List<ISensorInfo<Int32>> Sensors { get; set; }
     }
   }
}

**using Example.Sensors.Type1; // Added this to not throw the exception**
using System;

namespace Example.Sensors
{
    public interface ISensorInfo<T>
    {
        String SensorName { get; }
    }
}

using Example.Sensors;

namespace Example.Sensors.Type1
{
    public class Type1SensorInfo<T> : ISensorInfo<T>
    {
        public Type1SensorInfo() 
    }
}

答案 32 :(得分:0)

以防它对任何人都有帮助,虽然这是一个老问题,但我的问题有点奇怪。

使用Jenkins时出现此错误。

最终发现系统日期是手动设置为将来的日期,这导致dll在未来日期编译。当日期恢复正常时,MSBuild会解释该文件较新且不需要重新编译项目。

答案 33 :(得分:0)

这发生在我身上使用MVC4,我在读完这个线程后决定重命名抛出错误的对象。

我做了一个干净的重建并注意到它正在跳过两个项目。当我重建其中一个时,我发现了一个错误,我没有完成它。

所以VS引用了一个我改写过的模型而没有问我是否愿意这样做。

答案 34 :(得分:-1)

我在测试一位同事编写的一些代码时遇到了这个异常。这是异常信息的摘要。

未找到方法:“ System.Threading.Tasks.Task 1<Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry 1 > Microsoft.EntityFrameworkCore.DbSet`1.AddAsync ...

这是在Visual Studio 2019中针对.NET Core 3.1的类库中的。解决方法是在DbSet上使用Add方法而不是AddAsync。