【问题标题】:Method not found on runtime在运行时找不到方法
【发布时间】:2021-10-21 05:39:45
【问题描述】:

我有一个 ASP.Net c# 项目试图访问另一个项目中的类中的方法。它适用于类中的前半部分方法,但不适用于我最近添加的类中的另一半方法。他们编译,但他们在运行时抛出一个未找到方法的异常。

有人有什么想法可以尝试吗?我试过了:

  1. 重新创建.sln 文件
  2. 在另一个类库项目中订阅,我知道这很有效。看来错误出在我的主项目中,它调用了另一个项目中的方法。

【问题讨论】:

  • 可能你错过了“public”修饰符。
  • 确保您的 asp.net Web 应用程序是您的 dll 的正确更新版本
  • 到目前为止您排除了什么?您是否有正确的命名空间,方法是否公开,您是否已完成构建干净?您的引用是指向 Visual Studio 中的其他项目还是指向文件系统中的 DLL?
  • 希望您正在构建您已修改的项目,否则更改将不会被推送
  • 您应该粘贴您的代码并在此处指定错误...

标签: c# asp.net methodnotfound


【解决方案1】:

“找不到方法”是一个非常具体的错误,这意味着它预期的方法(即在编译时存在)根本不存在。这通常意味着您正在部署的文件与您认为的不同 - 具体来说,我敢打赌您正在部署库的 old 版本(缺少您的补充)。

检查部署到网络服务器的 dll 是否符合您的想法

【讨论】:

  • 您对这是为什么有任何解释或更多信息? (我正在努力寻找这个问题的答案:stackoverflow.com/questions/9127165/…
  • @Protectorone 简单地说:如果它 加载 的 dll 没有 requested 的方法(因为它与那个不同的版本它是针对)编译的)-您建议它应该具有什么?
  • 如果真的没有方法,当然没有。但是,如果存在具有匹配方法签名的方法,也会引发此错误。如果方法签名没有改变,我觉得重新编译是有序的,这很奇怪。
  • 如果是 SharePoint 解决方案,请尝试 IISreset。
  • 尝试了一切 - 清理、重建、手动删除 .dll、重新添加引用。原来我需要在 web.config 中将 optimizeCompilations 设置为 false - 似乎这不断导致旧代码在某处被引用
【解决方案2】:

我有同样的问题。就我而言,这是由添加optional argument 引起的。 所以首先你会:

引用程序集:

referencedAssembly.DoStuff(firstArgument, secondArgument)

引用程序集:

public void DoStuff(string firstArgument, string secondArgument)
{
   //stuff to do
}

然后你给方法添加一个可选参数,但是你在调用它时没有提供那个参数。

引用程序集:

referencedAssembly.DoStuff(firstArgument, secondArgument)//unchanged

引用程序集:

public void DoStuff(string firstArgument, string secondArgument, string thirdArgument = "default value")
{
   //stuff to do
}

在本地,这将构建并运行良好,因为新构建的引用Assembly.dll 将引用 DoStuff(string, string, string) 方法。但是,当您只部署更改后的 referencedAssembly 时(考虑:添加的参数是可选的,并且 referncingAssembly 仍然有效),旧版本的 referencingAssembly 将抛出 MethodNotFound,因为它会寻找带有签名 DoStuff(string, string) 的方法,即由于我们添加了额外的(可选)参数,因此不再出现在 referencedAssembly 中。


一个可能的解决方案可能是过载:

引用程序集:

public void DoStuff(string firstArgument, string secondArgument)//original method
{
   DoStuff(firstArgument, secondArgument, "default value")
}
public void DoStuff(string firstArgument, string secondArgument, string thirdArgument)//new overload of the method
{
//stuff to do
}

或者部署新构建的引用Assembly(它将引用带有签名DoStuff(string, string, string)的方法)。

【讨论】:

  • 这正是我遇到的情况。认为可选输入是可以的,但实际上不是。完美修复!
【解决方案3】:

您的解决方案中有两个项目:项目 A 和项目 B。两个项目都使用 nuget 包“DoStuff”,但 DoStuff 包的版本不同:

  • 项目 A 引用了 DoStuff 的 1.1 版。
  • 项目 B 引用了 DoStuff 的 1.0 版。
  • 项目 B 引用项目 A。

1.1版本有一个新方法,用在A项目中,当B项目使用A项目时,会得到这个MethodNotFoundException异常,因为B项目的DoStuff版本不知道A项目在说什么。

为了防止这种情况,如果项目使用相同 nuget 包的不同版本,我们会进行单元测试。一个相对简单的门挡,在过去几年为我们省去了一些麻烦。

【讨论】:

  • 谢谢,这行得通。忘记更新 B 项目中的 dll 引用
【解决方案4】:

我遇到过这种问题,但能够解决。我清空了 bin 和 debug 文件夹并尝试再次构建项目。它起作用了,至少对我来说。或者尝试清理解决方案并尝试重建它。但当然,发布您的部分代码可能会更有帮助。

【讨论】:

  • 就我而言,我必须手动删除我的 bin 文件夹,只是 build->rebuid 解决方案不起作用。
【解决方案5】:

有同样的问题,在我的例子中,在 webconfig 中将 optimizeCompilations 设置为 false 解决了问题

【讨论】:

  • 网络配置很大。如果还没有,应该在哪里添加 optimizeCompilations?
【解决方案6】:

我遇到了一个非常相似的问题,发现 GAC 安装了旧版本的程序集。卸载该版本后,项目编译并正确运行。因此,请检查 GAC (C:\Windows\Assembly) 以确保它未在此处列出。

【讨论】:

  • +1 同样在这里.. 更新了 GAC,突然有新方法可用
  • 我想下面是 GAC 路径:C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\
【解决方案7】:

我也遇到了同样的异常,虽然我的问题不同,但我的一个库中有一个方法,最初看起来像这样:

public void WriteMessage(string msg) 
{
    ...
}

并且有一些新的修改请求变成了这样:

public void WriteMessage(string msg, int code = 100)
{
    ...
}

之后,我用新编译的二进制文件更新了使用这个库的项目,它开始抛出这个异常。

经过多次尝试,没有任何效果,甚至项目清理,重建,删除和重新添加引用,然后我尝试修改项目的方法调用:

...
library.WriteMessage('hello!');
...

到:

...
library.WriteMessage('hello!', 100);
...

然后编译项目,问题解决了,之后我改回:

...
library.WriteMessage('hello!');
...

现在它神奇地修复了一切,也许有一些缓存的元数据没有被更新,通过改变方法的调用方式清楚地提醒它方法的签名是不同的,但不是这样不同。

希望这可以帮助遇到我遇到同样问题的人。

【讨论】:

  • 虽然我无法告诉您为什么重新添加引用和重建不起作用,但我可以告诉您添加可选参数会改变方法调用的编译方式。虽然代码看起来与library.WriteMessage('Hello') 相同,但编译器会编译调用,就好像您输入了library.WriteMessage('Hello',100);
  • @Grax 这就是我想象的那样,虽然经验讲述了另一个故事,这对我来说似乎很奇怪,无论如何,感谢您的确认,它确实消除了我的一些疑问和神秘感仍然...
【解决方案8】:

看,这一定是有史以来最奇怪的原因,但是经过一上午的尝试,从头开始重建项目等,我注意到唯一可以避免该问题的唯一方法是我的库是否具有不同的程序集名称.

我的脑海里有一个可怕的建议,我在 GAC 中安装了以前的 dll 版本,但我已经检查过了,此外,这绝不是我的意图。但是按照那条线索,我发现了这个dll(以及项目中的所有其他dll!)安装在 C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE !!!!!!

啊啊啊!猜猜我是唯一一个以某种方式搞砸了这件事的人,但我不知道为什么,我只是想我可以让其他人免于这种挫败感,因为有人很不幸!

【讨论】:

    【解决方案9】:

    我在使用 nuget 包管理的 dll 运行应用程序时遇到了同样的问题。 事实证明,当我尝试从 nuget 包管理器更新 dll 时,它没有更新我的测试层。 我建议您检查您所指的 dll 的版本。 转到 VS 中的 ObjectBrower 并检查 dll 并检查引用位置:确保您引用的是最新的 dll。

    【讨论】:

      【解决方案10】:

      我的情况与这里的其他情况略有不同;但它可能会帮助某人。 我刚刚在库中添加了一个可选参数,并使用该库从 GUI 获取了该消息。

      问题是由 GUI 和它的一个库引用同一个库引起的,但其中一个库不是最新的。

      我有

      • GUI 引用 LibA 和 LibZ
      • LibA 引用 LibZ

      所以我刚刚删除了 LibA 和 GUI 的所有“bin”和“obj”文件夹,确保两者中都有更新的 LibZ DLL,一切都恢复正常了。

      【讨论】:

        【解决方案11】:

        如果您将另一个项目引用为.exe,则必须将其重新构建为.dll,为此您必须在项目设置中将引用的项目设置为class library,然后构建它并将dll引用到该项目是缺少方法。

        【讨论】:

          【解决方案12】:

          我遇到了同样的问题,然后我将方法名称更改为不同的名称,并更改了引用。然后效果很好。我不知道问题出在哪里,但在某些情况下更改方法名称时似乎存在错误,不适用于整个系统。

          【讨论】:

            【解决方案13】:

            当我将 Action 作为参数时,也会发生错误。 我传递了一个方法,但没有将它包装在一个新的 Action(..) 中。

            DLL 有这个:

            public bool ShowMyForm(bool showConnectionWindow, Action onCloseNotify) {...}
            

            像这样调用 DLL 的测试应用:

            private void onFormClose()
            {
                MessageBox.Show("Form Closed");
            }
            
            private void ShowForm()
            {
                 mydll.ShowMyForm(true, onFormClose ); // bug here: wrap in Action
            }
            

            当我将调用更改为

            mydll.ShowMyForm(true, new Action(onFormClose) );
            

            异常消失了。异常文本只是误导 - 方法在那里,但参数的类型给出了运行时异常。可惜它没有在编译时被拾取。

            【讨论】:

              【解决方案14】:

              在我的例子中,我部署到了 .NET 3.0 PC (Windows XP),而编译目标是 .NET 3.5。我真的很想知道为什么没有更基本的警告......

              问题是从 System.Runtime.Serialisation 使用 DataContract。

              【讨论】:

                【解决方案15】:

                当我将解决方案复制到另一台机器上的不同位置时,我遇到了这个问题。只需更改 Build 文件夹。不要问我为什么,但是解决方案是在 build 文件夹中构建的(我们称之为文件夹 A),然后将旧副本从文件夹 B 复制到文件夹 C。在运行时它找不到我的最新代码,因为它是查看文件夹 C 中的旧版本。在“构建”选项卡中解决方案的“属性”中,我将“输出路径”更改为文件夹 B。然后它在文件夹 B 中构建了最新版本,并将其复制到文件夹 C 中,并且一切正常。

                我不知道为什么我们首先要有文件夹 C。我有一个 codedUI 测试解决方案,文件夹 C 是“C:\Users\\Documents\MyCodedUISolution\TestResults\_ 2017-04-20 11_31_29\Out”。我不知道它的用途和创建原因,但如果旧代码在这里复制是因为您更改了输出路径,或者您在没有将输出路径更改为需要的情况下移动了解决方案,那么您就有麻烦了。

                【讨论】:

                  【解决方案16】:

                  就我而言,我已将方法的返回类型从 IQueryable 更改为 IEnumerable。

                  我已经重新编译并上传了包含该方法的 DLL,但没有上传包含调用该方法的代码的 DLL。所以调用 DLL 仍然期待具有先前返回类型的方法并且找不到它。

                  【讨论】:

                    【解决方案17】:

                    我无法使用任何建议的答案来解决它。 我找不到任何旧版本的自定义程序集。我用Everything这个工具到处搜索。 在调试模式下,它显示了正确版本的程序集,但仍然找不到方法。

                    .csproj 文件中启用Automatic Binding 为我修复了它

                    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
                    

                    我的项目中的目标是 .NET Framework 4.5 包。如果项目中的所有包都针对 .NET Framework 4.5.1 或更高版本,则不需要上述设置。

                    【讨论】:

                      【解决方案18】:

                      这可能是迟到的回应: 但一种可能的补救方法是清理 Temporary ASP.NET 文件夹: 即 C:\Windows\Microsoft.NET\Framework\vX.X.XXXXX\Temporary ASP.NET Files

                      删除与您的网站相关的文件夹,并重建解决方案。

                      【讨论】:

                        【解决方案19】:

                        除了 Nirman 的回答 - 不要忘记在 C:\Users\UserName\AppData\Local\Temp\Temporary ASP.NET Files 位置清除临时文件。

                        我将类字段类型从枚举更改为字符串,然后出现错误

                        System.MissingMethodException:找不到方法:'DatnesVeidi DatnesModel.get_DatnesVeids()'

                        在渲染 Razor 视图时。之前的建议都没有帮助,只是清除用户本地临时文件。

                        【讨论】:

                          【解决方案20】:

                          对于将来访问此问题的其他人:

                          我在测试与另一个项目集成的替换 netstandard2.0 库时遇到了这个问题。生态系统中的一些其他项目也依赖于这个替代库。

                          在系统中测试新库时,出现MissingMethodException

                          在我的例子中,我们在新库中更改了基类抽象方法的实现,但我们没有重建依赖于新库的项目。

                          这一定导致在运行时缺少方法的预期抽象实现。

                          这有助于确保所有依赖项正在重建。

                          【讨论】:

                            【解决方案21】:

                            晚会有点晚了。

                            检查 GAC 的内容。

                            如果您的 .dll 已经在其中,那么您需要将其删除。

                            使用开发人员命令提示符以管理员身份运行并输入

                            gacutil -u {你的 dll 的名称}

                            【讨论】:

                              【解决方案22】:

                              我也遇到了同样的问题,我什至清理并重建了解决方案,但没有帮助。 当我发布应用程序时,旧版本的 dll 在 bin 文件夹中。 所以我在 assemblyinfo 文件中更改了程序集版本。最后它开始工作了。 新版本在 bin 文件夹中。

                              【讨论】:

                                【解决方案23】:

                                我知道这是一个非常古老的问题,但也许这会对某人有所帮助。

                                我遇到了完全相同的问题。解决问题实际上是删除我最近从网络服务器发布的所有项目文件,清理并重建项目并再次发布。

                                执行此操作后,我收到异常“文件尚未预编译且无法请求”。原来我缺少一个程序集。

                                该错误消息绝对具有误导性,我花了 3 天时间来解决该问题。

                                【讨论】:

                                  【解决方案24】:

                                  我刚遇到这个问题:

                                  Project X 是其他项目使用的库,它包含 dll Y。 项目 A 包含旧版本的 dll Y,项目 A 调用项目 X 中来自 dll Y 的代码。

                                  从该 dll 调用代码时使用的是旧版本的 dll。 而其他没有引用 dll Y 的项目,只是在项目 X 中使用了最新的 dll Y。

                                  确保在包含它的所有项目中更新 dll/nuget 包。

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2022-10-24
                                    • 1970-01-01
                                    • 2014-09-04
                                    • 2018-12-25
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多