Xamarin+.NET Standard之同時存在的HttpClient衝突小筆記

Xamarin+.NET Standard之同時存在的HttpClient衝突小筆記

.NET Standard - HttpClient Error Message
.NET Standard - HttpClient build error message

團隊試著使用「Xamarin + .NET Standard」的組合來試著開發跨平台應用程試,因為 .NET Standard 是比較新的 PCL(可攜式類別庫),碰到問題解決時,G大和S大能提供的解決方法也比較少,例如,如上圖,在 .NET Standard 裡呼叫 HttpClient 連編譯都有問題,這可不好玩…

問題還原

使用前面提供的 Xamarin - .NET Standard 專案範本新增專案。

Xamarin - .NET Standard Project template

由於我們要存取 API,依照正常的教學與常識,我們首先加入 HttpClient 函式庫:

加入 HttpClient 參考

HttpClient 函式庫的選擇,可以參考之前的揭開HttpClient APIs在UWP的神秘面紗文章。我們選擇第一個 Microsoft.NET.Http 組件來加入參考:

{
  "supports": {},
  "dependencies": {
    "Microsoft.Net.Http": "2.2.29",
    "NETStandard.Library": "1.6.1",
    "Newtonsoft.Json": "9.0.1",
    "Xamarin.Forms": "2.3.3.175"
  },
  "frameworks": {
    "netstandard1.4": {
      "imports": "portable-net45+wpa81+wp8+win8"
    }
  }
}
 

重新建置後,寫下第一行 HttpClient 程式碼:

HttpClient htpclient = new HttpClient();
 

即可得到紅色錯誤提示,建置錯誤訊息:

類型 'HttpClient' 同時存在於 'System.Net.Http, Version=1.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 和 'System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 中

The type 'HttpClient' exists in both 'System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' and 'System.Net.Http, Version=1.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

問題原因

NETStandard.Library.packages.targets

.NET Standard 已經內含 System.Net.Http 組件,所有當你安裝了 Microsoft.NET.Http 組件,會得到二個相同命名空間衝突錯誤。

解決辦法

移除 Microsoft.Net.Http 的參考,並重新建置即可。

{
  "supports": {},
  "dependencies": {
    "NETStandard.Library": "1.6.1",
    "Newtonsoft.Json": "9.0.1",
    "Xamarin.Forms": "2.3.3.175"
  },
  "frameworks": {
    "netstandard1.4": {
      "imports": "portable-net45+wpa81+wp8+win8"
    }
  }
}
 

小結

這一次的經驗非常明顯是對 .NET Standard 目前所擁有組件的不夠了解,重覆參考了相同命名空間的組件所造成的。而且G大和S大找到的都是比較早期的錯誤與解答,還好,後來自己想想「同時存在」又在參考列表看不到,找到 NETStandard.Library.packages.targets 資訊後,答案就很清楚了。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。