Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

[.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下載:下載鏈接

如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
comments powered by Disqus