0%

MissingMethodException

情境

寫單元測試的時候編譯都沒問題,但在執行時一直報錯 System.MissingMethodException 的錯誤,查了一下發現跟 System.Net.Http 有關

System.MissingMethodException with message

“Method not found: ‘System.Web.Http.Results.ResponseMessageResult

System.Web.Http.ApiController.ResponseMessage(System.Net.Http.HttpResponseMessage)”

檢查測試專案與受測專案的 System.Net.Http Nuget套件皆為同一個版本

/images/20181114/1.png

但意外發現兩個專案的 System.Net.Http 參考卻為不同位置

/images/20181114/2.png

/images/20181114/3.png

照理來說應該都要參考到專案內的 packages 底下才對,檢查 .csproj 裡面的 Reference 並沒有寫錯

1
2
3
<Reference Include="System.Net.Http, Version=4.1.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> 		  
<HintPath>..\..\packages\System.Net.Http.4.3.2\lib\net46\System.Net.Http.dll</HintPath>
</Reference>

在網路上也搜尋到相關文章討論似乎是 Visual Studio Bug 導致

/images/20181114/4.png

這位仁兄也碰到一樣問題

  1. 他開啟了一個新專案

  2. Nuget 安裝 System.Net.Http v4.3.3

  3. 建置時 System.Net.Http 參考都還是來自於 Package 資料夾底下

  4. Nuget 安裝 System.Collections.Immutable v1.4.0

  5. 建置時 System.Net.Http 參考就跑到 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll 底下

解決方法

檢查 Microsoft.NET.Build.Extensions 資料夾底下的 dll 版本為 4.2.0.0 ,而 Nuget System.Net.Http 4.3.2 的 dll 版本則為 4.1.1.1 ,這也是間接導致發生此錯誤的原因。

但 Reference HintPath也沒寫錯,VS 裡面也沒辦法調整 dll 位置 , 最後索性直接刪除 Microsoft.NET.Build.Extensions 資料夾底下的 System.Net.Http ,重新建置後 dll 就重新指向 Package了,此問題得到解決

世界又再一次恢復了和平,!@#$%

參考文章

  1. MIssing method in System.Web.Http.ApiController.get_Request()
  2. System.Net.Http package 4.3.2 - redirect to 4.2.0.0, assembly loading failure