【问题标题】:Method not found on release build在发布版本中找不到方法
【发布时间】:2017-03-02 15:57:03
【问题描述】:

最近,我的网站遇到了速度变慢的问题,并且已经找到了原因。背后的原因是因为我的 DA 层中的方法具有 IEnumerable 参数而不是 IQueryable。我已经重构了我的 DA 中的参数,并且成功构建了解决方案。但是在prod中替换DA的dll后,BL层出现了找不到错误方法。它正在寻找的方法是具有 IEnumerable 参数的先前方法。为什么我在我的解决方案中构建代码时会遇到这种情况?

注意:我没有替换除 DA 之外的任何其他 dll

【问题讨论】:

  • 它是强命名的吗?
  • 嗯。强名是什么意思??抱歉,还有很多术语我不熟悉

标签: c# ienumerable iqueryable methodnotfound


【解决方案1】:

为什么我在我的解决方案中构建代码时会遇到这个问题?

大概是因为您也在重建 BL 项目。这很好 - 该方法仍然存在按名称,并且新的参数类型可能与您传递的参数兼容,因此您的源代码仍然可以编译。

但是当您尝试替换 just 您的 DA 程序集时,当您的 BL 程序集代码执行时,它仍在寻找带有 IEnumerable 参数的方法,但该方法不再存在,因此例外。

简而言之,就二进制兼容性而言,更改方法参数类型不是向后兼容的更改。

只需重建整个项目,并替换依赖于您的 DA 程序集以及 DA 程序集本身的所有内容。理想情况下,完全替换您构建的所有内容 - 这样您就知道您拥有一组一致的程序集。

【讨论】:

  • 哇哦!!也许这解释了为什么当我做相反的事情(构建我的 BL,恢复我的 DA)时,仍然没有找到方法,但现在它正在寻找 IQueryable。一定要看看这个
  • @JanLyndonJasa:从根本上说,我鼓励您重新部署您重建的所有内容,而不是一次部署一个程序集。这样你就知道程序集是一致的。
  • 不能对 Jon Skeet 的回答说太多,但是,如果您调用方法,我想补充一下。运行时将根据您调用的 SIGNATURE 找到该方法。由于参数是签名的一部分,因此如果它们发生更改,您将无法调用它。
  • @NoëlWidmer:运行时对返回类型也很敏感,这不是 C# 术语中签名的一部分。
  • @JonSkeet 哇,谢谢你的课。没有意识到这一点! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 2013-03-18
相关资源
最近更新 更多