2017年10月13日 星期五

[.Net Core 與 .Net Standard 實戰教學][Lab][03-3].Net Standard 2.0能夠直接Reference .Net Framework Library

image
圖片來源:https://pixabay.com/en/workshop-rustic-hammer-wrench-tool-2608390/

透過上一個lab: 了解到了如何更容易評估把.net framework程式碼port到.net Standard之後,接下來的問題就是,可是有些第三方.net framework library沒有source code但是又要用怎麼辦?

在這個lab將會介紹.Net Standard 2.0帶來的一大優勢,能夠直接reference .net framework的library。將會使用一個2012的library:NQuery,主要目的是可以用sql語法來查詢資料。將會調整改成這種方式來查資料。

上個lab的最後成果的程式碼可以再github看到:https://github.com/alantsai-samples/2017-10-14-net-core-workshop

git標籤:lab3/1-port-net-standard-finish

兩種方式取得:

  1. 用git clone然後在checkout到lab3/1-port-net-standard-finish
  2. 從github release下載:下載鏈接

操作步奏

  1. 修改Net Standard Library使用NQuery
  2. 測試net core console結果
  3. 測試WinForm

修改Net Standard Library使用NQuery

以NQuery這個套件為例子,最後更新是2012年 肯定不是.net core
https://www.nuget.org/packages/NQuery/
image
準備加入Nquery
  1. NorthwindDalNetStandard右鍵
  2. 選擇Manage Nuget Package..
  3. 搜索NQuery
  4. 安裝
image
調整 NorthwindDalNetStandard.NorthwindDal.csGetEmployeeFromCountry方法內容,改成用NQuery來過濾
改成以下程式碼:
public static string GetEmployeeFromCountry(string filterCountry = "UK")
{
 DataSet dataSet = new DataSet();
 dataSet.ReadXml("northwind.xml");

 var dataContext = new DataContext();
 dataContext.AddTablesAndRelations(dataSet);

 var sql = @"
  SELECT  e.FirstName + ' ' + e.LastName
  FROM    Employees e
  WHERE   e.Country = '" + filterCountry + "'";

 var query = new Query(sql, dataContext);
 var results = query.ExecuteDataTable();
 var values = results.Rows.Cast<DataRow>().Select(r => (string)r[0]);
 var result = string.Join(Environment.NewLine, values);

 return result;
}

測試net core console結果

build專案,並且用dotnet執行
cmd執行:dotnet NetCoreConsole.dll
image

執行結果和未修改前一致,換句話說使用沒有問題

測試WinForm

如果用 WinForm來執行會出錯

會出現說 Nquery 這個 dll 找不到

System.IO.FileNotFoundException: Could not load file or assembly 
'NQuery, Version=0.9.5.0, Culture=neutral, PublicKeyToken=c65c4087e4cc0612' 
or one of its dependencies. The system cannot find the file specified.
     
image
這個是一個已知的bug,只有以前的程式(.Net Framework)的會發生,需要手動改csproj
先對LegacyApplication.View右鍵然後選擇Unload Project
image
這個bug目前沒有任何預計解決辦法,只有改csproj檔案而已。相關issue請看:https://github.com/dotnet/sdk/issues/901
在來對csproj做修改
  1. LegacyApplication.View右鍵,然後選擇 Edit LegacyApplication.View.csproj
  2. 加入<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
  3. 確定也有<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  4. 好了 之後 Reload Project
image
設定 為起始專案 之後嘗試執行
image

透過以上方式,據說70%的nuget net Framework api net standard 2.0 都能夠支援,換句話說能夠減少整合成本。

雖然說.Net standard 2.0可以直接reference,但是如果是可以控制的lib,建議還是統一改成net standard,更容易和未來接軌。

完整程式碼可以再github看到:https://github.com/alantsai-samples/2017-10-14-net-core-workshop

git標籤:lab3/3-use-net-framework-lib-finish

兩種方式取得:

  1. 用git clone然後在checkout到lab3/3-use-net-framework-lib-finish
  2. 從github release下載:下載鏈接

沒有留言 :

張貼留言