System.MissingMethodException:找不到方法?

Posted

技术标签:

【中文标题】System.MissingMethodException:找不到方法?【英文标题】:System.MissingMethodException: Method not found? 【发布时间】:2011-12-24 22:07:31 【问题描述】:

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

System.MissingMethodException:找不到方法

DoThis 方法在同一个类上,它应该可以工作。

我有一个这样的通用处理程序:

public class MyHandler: IHttpHandler

    public void Proces-s-request(HttpContext context)
    
      // throws error now System.MissingMethodException: 
      // Method not found.
      this.DoThis(); 
    

    public void DoThis() ... 

【问题讨论】:

你能再贴一些代码吗,因为这个代码是无效的。 什么是somepage?正如“声音”所指出的,此代码无效。请给我们一个演示问题的完整代码sn-p。 如果您在机器上本地运行时遇到此错误,请尝试在 web.config 中将 optimizeCompilations 键设置为 false 进行重新编译。 【参考方案1】:

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

【讨论】:

特别是,确保旧版本不在 GAC 中。 另外,如果你在不幸的情况下工作,你有一个依赖于一个库的库,它依赖于一个库等。然后确保清理/重建所有依赖库在我的情况下,使用相同版本的任何 dll,NHibernate... 升级项目的.NET目标框架也可以修复错误。我正在升级针对 .NET 4.5 的 MVC4 / Web API 1 项目。在升级所有 MVC、Web API 和 Entity Framework 依赖项后,我遇到了同样的错误;将目标框架更改为 .NET 4.5.1 使错误消失。 我发现在调试时打开 Debug -> Windows -> Modules 窗口以查看从何处加载程序集很有用。 我已经多次被 GAC 问题所困扰,这可以从我在过去某个时间点再次“发现”这个答案时对 @ladenedge 的评论进行投票来证明。跨度> 【参考方案2】:

⚠️ 错误的 Nuget 包版本 ⚠️

我有一个单元测试项目,它正在拉入我们公司内部的 EF Nuget 数据访问包,该代码 拉入一个外部包,其版本是 way 落后于当前版本。

问题在于 *** 包的 Nuget 设置设置为 least version低级/旧版本获胜,并且在操作过程中使用....

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


? 解决方案 ?

通过在 Nuget 中设置/更新要使用的包并[获取]最新的,解决了该问题。

【讨论】:

这为我解决了问题。管理解决方案的包不起作用,但我必须单独更新每个项目。 我的单元测试项目比我的实际项目引用了一个新版本【参考方案3】:

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

【讨论】:

.NET 3.5 编译目标和安装.NET 3 的一些问题。我真的想知道为什么在启动时没有更多基本警告... 对于 .NET Framework 版本 > 4.0,您需要指定库存单位 (SKU),它表示应用所针对的 .NET Framework 版本。 docs.microsoft.com/en-us/dotnet/framework/configure-apps/…【参考方案4】:

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

【讨论】:

【参考方案5】:

检查您的参考资料!

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

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

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

【讨论】:

对我来说,清理项目并删除并再次添加一些引用效果很好。 这在 VS 2017 中尤为突出,因为它通常会为您添加一个引用,该引用将源路径设置为解决方案中另一个项目的输出文件夹,而不是引用程序集的输出文件夹。 【参考方案6】:

我在同一个程序集中引用了一个文件,而不是一个单独的 dll。一旦我从项目中排除该文件,然后再次包含它,一切正常。

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

应该如何检查? 我认为在 nupkg 中。【参考方案9】:

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

【讨论】:

【参考方案10】:

您是否尝试过关闭并再次打开?撇开玩笑不谈,重新启动我的计算机实际上对我有用,并且在任何其他答案中都没有提到。

【讨论】:

【参考方案11】:

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

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

【讨论】:

【参考方案12】:

问题也可能出在报告丢失的方法的参数或返回类型上,而“丢失”方法本身很好。

这就是我的情况,误导性信息使我花费了更长的时间来解决问题。事实证明,参数类型的程序集在 GAC 中有一个旧版本,但由于使用的版本编号方案发生了变化,旧版本实际上具有更高的版本号。从 GAC 中删除旧/更高版本解决了该问题。

【讨论】:

【参考方案13】:

就我而言,这是一个复制/粘贴问题。我不知何故为我的映射配置文件创建了一个 PRIVATE 构造函数:

using AutoMapper;

namespace Your.Namespace

    public class MappingProfile : Profile
    
        MappingProfile()
        
            CreateMap<Animal, AnimalDto>();
        
    

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

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

【讨论】:

@RenaudGauthier 也许我在 Jon Skeets 的回答中误读了一些东西,但他说没有访问修饰符的类是内部的,并且在 cmets 中他字面意思是“不,不是。如果你声明一个构造函数并且不要'不指定可访问性,它将是私有的。请参阅 C# 规范的第 10.3.5 节“。所以我想我的构造函数毕竟是私有的?如果我错了,请纠正我。是的,我的回答断章取义,我来自另一个问题(没有为我提供答案)。我也会在那里添加一个指向我的答案的链接。 你说的很对,别管我,没用的评论我都删了。【参考方案14】:

使用 Costura.Fody 1.6 和 2.0: 在浪费了很多时间来研究所有其他潜在解决方案都不起作用的同类错误之后,我发现我嵌入的旧版本的 DLL 位于我运行新编译的 .exe 的同一目录中。显然它首先在同一目录中查找本地文件,然后向内查找其嵌入式库。删除旧 DLL 有效。

要清楚,并不是我的引用指向一个旧 DLL,而是旧 DLL 的副本位于我正在测试我的应用程序的目录中,该目录与它编译的系统不同开。

【讨论】:

与 Costura.Fody 4.1.0 相同【参考方案15】:

我遇到过类似的情况,我遇到了同样的异常。我的 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 的部分时,我收到了“Method not found”错误。

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

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

【讨论】:

【参考方案16】:

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

【讨论】:

【参考方案17】:

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

【讨论】:

【参考方案18】:

就我而言,我的项目引用了Microsoft.Net.Compilers.2.10.0。当我将它切换到Microsoft.Net.Compilers.2.7.0 时,错误就消失了。多么神秘的错误,原因多种多样。

【讨论】:

【参考方案19】:

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

【讨论】:

【参考方案20】:

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

【讨论】:

【参考方案21】:

就我而言,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 作为其参数或返回类型的本地函数(调试时的参数,不带调试器运行测试时的返回类型,也有点奇怪)。而不是显示无法加载 4.2.0.0 版本的 System.Net.Http 的消息,而是返回此异常。

【讨论】:

【参考方案22】:

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

所以:

项目 -> Nuget A -> Nuget X 1.1

项目 -> Nuget B -> Nuget X 1.2

Nuget X 的两个版本都具有从 Project 中调用的相同扩展方法。

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

【讨论】:

【参考方案23】:

可能的情况

nuget 汇编版本不匹配

问题详情

我们有多个由解决方案生成的 nuget 包。

packageA 1.0 中的 A 类

packageB 1.0 中的 B 类

A 指的是 B

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

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

因此找不到方法

解决方案

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

PackageA 1.1 -> PackageA 1.2

包 B 1.0 -> 包 B 1.1

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

PackageA 1.1 -> PackageA 1.2

包 B 1.0 -> 包 B 1.2

【讨论】:

【参考方案24】:

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

我进行了清理和重建,并注意到它跳过了两个项目。当我重建其中一个时,出现了一个错误,我启动了一个函数但没有完成它。

所以 VS 引用了一个我已经重写的模型,而没有询问我是否愿意这样做。

【讨论】:

【参考方案25】:

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

我在使用 Jenkins 时遇到了这个错误。

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

【讨论】:

【参考方案26】:

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

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() 
    

【讨论】:

【参考方案27】:

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

【讨论】:

【参考方案28】:

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

【讨论】:

【参考方案29】:

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

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

【讨论】:

【参考方案30】:

当方法需要一个我没有指定的参数时,我遇到了这个问题

【讨论】:

以上是关于System.MissingMethodException:找不到方法?的主要内容,如果未能解决你的问题,请参考以下文章