在运行时找不到的方法

时间:2011-09-28 05:07:37

标签: c# asp.net methodnotfound

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

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

  1. 重新创建.sln文件
  2. 在我认识的另一个类库项目中进行修改。看来错误发生在我的主项目中,该项目在另一个项目中调用该方法。

21 个答案:

答案 0 :(得分:53)

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

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

答案 1 :(得分:13)

我有同样的问题。在我的情况下,它是由optional argument的添加引起的。 所以首先你会:

<强> referencingAssembly:

File.Copy(@"I don't know", @"C:\Users\user-1\Desktop\", true);

<强> referencedAssembly:

referencedAssembly.DoStuff(firstArgument, secondArgument)

然后向方法添加一个可选参数,但在调用它时不提供该参数。

<强> referencingAssembly:

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

<强> referencedAssembly:

referencedAssembly.DoStuff(firstArgument, secondArgument)//unchanged

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

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

<强> referencedAssembly:

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

或者部署新构建的referencingAssembly(它将引用带有签名DoStuff的方法(字符串,字符串,字符串))。

答案 2 :(得分:10)

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

答案 3 :(得分:7)

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

答案 4 :(得分:4)

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

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

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

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

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

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

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

为:

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

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

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

现在它神奇地修复了所有内容,也许某些缓存的元数据留在某处未被更新,并且通过改变调用该方法的方式以某种方式清楚地提醒它该方法的签名是不同的,但并非如此不同。

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

答案 5 :(得分:4)

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

答案 6 :(得分: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包的不同版本,我们就会进行单元测试。一个相对简单的门挡在过去几年中为我们带来了一些麻烦。

答案 7 :(得分:2)

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

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

我遇到了同样的问题,然后我将方法名称更改为其他名称,并更改了引用。然后它很棒。我不知道问题是什么,但在某些情况下更改方法名称时,看起来有一个错误不适用于整个系统

答案 10 :(得分:1)

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

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

我有

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

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

答案 11 :(得分:0)

我知道这是一个非常老的问题,但这也许可以帮助到别人。

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

这样做之后,我得到了异常“文件尚未预编译且无法请求”。原来我缺少一个程序集。

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

答案 12 :(得分:0)

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

使用System.Runtime.Serialisation的DataContract时遇到了问题。

答案 13 :(得分:0)

对于以后访问此问题的其他人:

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

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

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

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

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

答案 14 :(得分:0)

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

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

  

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

渲染Razor视图时。先前的建议都无济于事,只是清除用户本地临时文件。

答案 15 :(得分:0)

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

答案 16 :(得分:0)

可能是一个较晚的响应: 但是一种可能的补救措施是清理ASP.NET临时文件文件夹: 即C:\ Windows \ Microsoft.NET \ Framework \ vX.X.XXXXX \ ASP.NET临时文件

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

答案 17 :(得分:0)

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

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

<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>

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

答案 18 :(得分:0)

在我的情况下,我已将方法的返回类型从IQueryable更改为IEnumerable。

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

答案 19 :(得分:0)

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

我不知道的是为什么我们首先拥有文件夹C.我有一个codedUI测试解决方案,文件夹C是&#34; C:\ Users \\ Documents \ MyCodedUISolution \ TestResults \ _ 2017-04-20 11_31_29 \ Out&#34;。这是用于什么以及为什么它被创建,我不知道,但是如果旧的代码被复制到此处是因为您更改了输出路径或者您移动了解决方案而没有将输出路径更改为什么&#39; s然后你需要麻烦。

答案 20 :(得分:0)

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