System.MissingMethodException:方法未找到?


244

曾经在我的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 2011年

2
什么somepage啊 正如“声音”所指出的,此代码无效。请给我们提供一个完整的代码片段,以演示该问题。
艾米(Amy)

Answers:


387

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


62
特别是,请确保GAC中没有旧版本。
ladenedge 2012年

7
另外,如果不幸的是,您有一个依赖于某个库的库,依赖于某个库的库等,那么请确保使用相同版本的dll清理/重建所有从属库,在我的情况下,NHibernate ...
Serj Sagan

2
升级项目的.NET目标框架也可以修复该错误。我正在升级针对.NET 4.5的MVC4 / Web API 1项目。升级所有MVC,Web API和实体框架依赖项之后,我遇到了相同的错误;将目标框架更改为.NET 4.5.1可使错误消失。
谢尔盖K

1
当我只部署了一个已更改的exe文件而没有部署帮助程序dll时,这发生在我身上,因为它没有任何代码更改-但它已被重新构建。我部署了重建的dll,错误消失了。我已经进行了其他部署,而没有重新部署原本不变的dll,并且没有任何问题,所以我仍然不确定这里到底发生了什么。我认为安全的做法是部署任何重建的文件,无论其是否具有基础代码更改。
Ho Ho Ho

14
我发现在调试以查看程序集的加载位置时,打开“调试”->“ Windows”->“模块”窗口很有用。
JamesD

31

W️ 错误的Nuget软件包版本 ⚠️

我这是在我们公司内部EF的NuGet数据访问包,拉着一个单元测试项目的代码 中拉外部包其版本的方式在当前版本的后面。

问题是该软件包的Nuget设置被设置为least version; 并且赢得了较旧的版本,并在操作过程中使用了...。

因此,对于程序包和应用程序都使用的通用程序集,它默默地得到了错误的版本


💡 解决方案 💡

通过在Nuget中设置/更新软件包以使用和[获取]最新版本,解决了该问题。


1
这为我解决了。管理该解决方案的程序包不起作用,但是我必须单独更新每个项目。
aoakeson

我的单元测试项目参考的是比实际项目新的版本
Rhyous

26

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


2
.NET 3.5编译目标并安装.NET 3时出现一些问题。我真的很奇怪,为什么启动时没有更多基本警告了?
Martin Meeser 2014年

对于.NET Framework版本> 4.0,您需要指定库存单位(SKU),它指示该应用程序面向的.NET Framework版本。docs.microsoft.com/en-us/dotnet/framework/configure-apps/...
bgcode

21

重新启动Visual Studio实际上为我修复了它。我认为这是由仍在使用的旧程序集文件引起的,执行“清理构建”或重新启动VS应该可以解决该问题。


5

我在同一程序集中引用的文件而不是单独的dll发生了这种情况。一旦我从项目中排除了文件,然后再次包含它,一切工作就很好了。


5

我只是在.NET MVC项目中遇到了这个问题。根本原因是NuGet软件包的版本冲突。我有几个项目的解决方案。每个项目都有一些NuGet软件包。在一个项目中,我有一个版本的Enterprise Library Semantic Logging程序包,在其他两个项目中(第一个引用了),我有相同版本的旧版本。一切都能正确编译,但是当我尝试使用该软件包时,它给出了一个神秘的“找不到方法”错误。

解决方法是从两个项目中删除旧的NuGet软件包,以便仅将其包含在实际需要它的一个项目中。(我也对整个解决方案进行了干净的重建。)


5

检查您的参考!

确保您在解决方案项目中始终指向相同的第三方库(不仅仅是信任版本,而是着眼于路径)。

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

我在所有3个项目中都将对iTextSharp的引用更改为指向相同的DLL,并且一切正常。


对我来说,它可以很好地清理项目并再次删除并添加一些引用。
Honza P. 18/09/27

VS 2017尤其存在问题,因为它经常为您提供添加引用,该引用将源路径设置为解决方案中另一个项目的输出文件夹,而不是引用程序集的输出文件夹。
TA先生

4

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

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

我应该如何检查?
SerG 2014年

我认为在nupkg中。
森尼特2014年

4

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


3

您是否尝试过关闭然后重新打开?除了玩笑,重新启动计算机实际上是解决我问题的方法,其他任何答案都未提及。


3

我刚遇到这个问题,事实证明那是因为我从我的UI项目中引用了DLL的早期版本。因此,在编译时很高兴。但是在运行时,它使用的是早期版本的DLL。

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


2

就我而言,这是一个复制/粘贴问题。我以某种方式最终为我的映射配置文件使用了PRIVATE构造函数:

using AutoMapper;

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

(请注意在ctor前面缺少的“ public”)

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


@RenaudGauthier也许我在Jon Skeets答案中误读了一些内容,但是他指出没有访问修饰符的类是内部的,并且在注释中他直言道:“不,不是。如果您声明构造函数并且未指定可访问性,它将私有。请参见C#规范的10.3.5节”。所以我想我的构造函数毕竟是私有的?如果我弄错了,请纠正我。是的,我的回答是没有上下文的,我来自另一个问题(没有为我提供答案)。我也将在此处添加指向我的答案的链接。
DaBeSoft '17

您说得对,没关系,我删除了无用的评论。
Renaud Gauthier

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文件夹中的所有文件,然后重新运行网站。在那之后,一切开始起作用。我还通过在构建配置中取消选中DAL.CustSpec项目来确保未构建该项目。

我想我会分享这一点,以防将来对其他人有帮助。


1

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



1

也有可能是报告的方法缺少参数或方法的返回类型,问题本身就是“ missing”方法。

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


1

使用Costura.Fody 1.6和2.0:
在浪费了很多时间调查这种错误之后,所有其他潜在的解决方案均无法正常工作,我发现我所嵌入的DLL的较旧版本位于我正在运行的目录中新编译的.exe来自。显然,它首先在同一目录中查找本地文件,然后向内查找其嵌入式库。删除旧的DLL可以正常工作。

需要明确的是,并不是我的参考指向一个旧的DLL,而是一个旧DLL的副本位于我要在与编译它的系统不同的系统上测试我的应用程序的目录中。


1

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



1

就我而言,MissingMethodException是用于同一文件中的方法的!

但是,我刚刚向目标4.7.1的项目中添加了使用.Net Standard2的NuGet程序包,这导致了System.Net.Http(4.7.1:4.0.0.0版,使用.NET的NuGet程序包)的版本冲突。标准2要求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 没有调试器的测试,也有点奇怪)。它返回此异常,而不是显示无法加载System.Net.Http的4.2.0.0版本的消息。


0

这是使用MVC4发生的,在读取此线程后,我决定重命名引发错误的对象。

我进行了一次干净的重建,并指出它正在跳过两个项目。当我重建其中的一个时,出现了一个错误,我启动了一个函数却没有完成它。

因此,VS引用的是我重写的模型,而没有问我是否要这样做。


0

为了以防万一,尽管这是一个老问题,但我的问题有点奇怪。

使用Jenkins时出现此错误。

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


0

我遇到了这个问题,对我来说,一个项目正在使用Example.Sensors命名空间中的List,另一个类型实现了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() 
    }
}

0

当我有多个MSBuild进程在后台运行并实际上崩溃时,我发生了同样的事情(它们引用了旧版本的代码)。我关闭了VS,并在进程浏览器中杀死了所有MSBuild进程,然后重新编译。


0

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


0

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

我退出了Spotify,一切恢复正常:)



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点自行结束。


0

必须是Microsoft的参考错误。

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

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

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.