在运行时找不到的方法

Bac*_*tnz 31 c# asp.net methodnotfound

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

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

  1. 重新创建.sln文件
  2. 在我认识的另一个类库项目中进行修改.似乎错误在我的主项目中调用另一个项目中的方法.

Mar*_*ell 57

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

根据您的想法检查部署到Web服务器的dll .

  • 如果是SharePoint解决方案,请尝试使用IISreset. (2认同)
  • 尝试了一切 - 清理,重建,手动删除.dll,重新添加引用.原来我需要在web.config中将optimizeCompilations设置为false - 这似乎不断导致旧代码被引用到某个地方 (2认同)
  • 另一个需要注意的事实是,被调用的方法调用另一个库中的方法,而另一个库又调用另一个库中的方法,而该方法可能会丢失。这将导致丢失的方法异常冒泡到第一层。确保方法链中在可执行文件的时间和位置可用的所有库都是更新的库。 (2认同)

noz*_*zem 14

我遇到过同样的问题.在我的情况下,它是由添加可选参数引起的.所以首先你会:

referencingAssembly:

referencedAssembly.DoStuff(firstArgument, secondArgument)
Run Code Online (Sandbox Code Playgroud)

referencedAssembly:

public void DoStuff(string firstArgument, string secondArgument)
{
   //stuff to do
}
Run Code Online (Sandbox Code Playgroud)

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

referencingAssembly:

referencedAssembly.DoStuff(firstArgument, secondArgument)//unchanged
Run Code Online (Sandbox Code Playgroud)

referencedAssembly:

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

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


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

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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这正是我所经历的场景。以为可选输入可以,但实际上不行。完美修复! (2认同)

Seb*_* H. 10

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

  • 网络配置很大。如果优化编译还没有的话,应该添加到哪里? (2认同)

inc*_*lly 9

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


San*_*ndy 7

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


Pet*_*oby 5

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