51

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

有没有人有任何想法我可以尝试?我试过了:

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

24 回答 24

74

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

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

于 2011-09-28T05:23:16.223 回答
23

我遇到过同样的问题。就我而言,这是由添加了一个可选参数引起的。所以首先你会有:

引用程序集:

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
}

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

于 2017-03-30T12:33:27.270 回答
10

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

于 2011-09-28T05:30:00.157 回答
10

您的解决方案中有两个项目:项目 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 包的不同版本,我们有一个单元测试会失败。在过去的几年里,一个相对简单的门挡为我们节省了一些麻烦。

于 2017-06-27T07:25:12.287 回答
9

有同样的问题,在我的情况下,在 webconfig 中将 optimizeCompilations 设置为 false 解决了这个问题

于 2015-01-12T09:52:11.353 回答
5

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

于 2013-04-03T16:10:30.387 回答
4

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

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

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

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

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

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

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

到:

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

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

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

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

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

于 2016-05-06T09:47:56.813 回答
3

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

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

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

于 2013-01-18T12:48:13.073 回答
2

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

于 2016-05-12T15:21:14.067 回答
1

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

于 2015-10-21T06:23:26.240 回答
1

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

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

我有

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

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

于 2017-03-31T13:57:48.133 回答
1

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

于 2019-06-24T11:07:07.247 回答
0

当我将 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) );

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

于 2013-07-02T10:51:26.037 回答
0

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

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

于 2014-04-17T10:47:50.877 回答
0

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

于 2017-03-28T06:19:59.163 回答
0

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

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

于 2017-04-20T10:46:13.863 回答
0

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

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

于 2017-06-29T08:37:52.780 回答
0

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

在文件中启用自动绑定.csproj为我修复了它

<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>

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

于 2018-03-30T14:33:05.613 回答
0

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

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

于 2018-07-13T08:15:47.310 回答
0

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

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

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

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

于 2019-10-09T13:34:11.637 回答
0

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

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

在系统中测试新库时,MissingMethodException发生了。

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

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

它可以帮助确保正在重建所有依赖项。

于 2020-06-29T15:08:55.393 回答
0

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

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

这样做之后,我得到了异常'该文件没有被预编译,不能被请求'。原来我缺少一个程序集。

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

于 2020-11-09T09:54:19.650 回答
0

晚会有点晚了。

检查 GAC 的内容。

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

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

gacutil -u {你的 dll 的名称}

于 2021-09-22T16:31:05.057 回答
0

我刚遇到这个问题:

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

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

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

于 2021-10-20T21:39:45.603 回答