Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 記錄軟體開發的點點滴滴 著重於微軟技術、網頁開發、DevOps:C#, Asp .net Mvc、Azure、Docker、Data Science

[.Net Core 與 .Net Standard 實戰教學][Lab][03-1]現有.Net Framework Lib 改成 .Net Standard

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

在前兩個lab 2裡面([Lab2-1]了解Framework Dependent Deployment(FDD)執行(發佈)模式[Lab2-2]了解Self Contained Deployment(SCD)執行(發佈)模式)了解了.Net Core和.Net Framework 不同執行模式以後。

在lab 3將會切換到另外一個很重要的部分,.Net Standard 2.0的到來。

這個lab將會介紹如何移轉現有target .net Framework的程式改成.Net Standard以達到多runtime使用重複邏輯。

一般來說會先port test程式碼,在port實際的業務程式碼,不過做法都類似,以這個範例就直接port業務程式碼。

操作步奏

  1. 取得一個WinForm的ap模擬一個要轉移的AP
  2. 建立一個.Net Standard 1.6的lib,嘗試轉移出現錯誤 - 了解如何檢查api版本
  3. 建立一個.net core console使用建立出來的.Net Standard Lib

取得一個WinForm的ap模擬一個要轉移的AP

先取得模擬舊ap的.net framework程式
可以兩個方式取得:
    • 用git clonehttps://github.com/alantsai-samples/2017-10-14-net-core-workshop.git
    • 用 git checkout切換到branch:lab3/1-port-net-standard-start
    • 瀏覽到:src\lab3-port-to-net-standard - 複製這個資料夾出來
      image
      看到:LegacyApplication.sln
  1. 可以使用 http://kinolien.github.io/gitzip/來下載,做法如下:

    1. 網址輸入:http://kinolien.github.io/gitzip/
    2. 鏈接輸入:https://github.com/alantsai-samples/2017-10-14-net-core-workshop/tree/lab3/1-port-net-standard-start/src/lab3-port-to-net-standard
    3. 按下 Download
    image

    或者使用https://minhaskamal.github.io/DownGit/#/home?url=https://github.com/alantsai-samples/2017-10-14-net-core-workshop/tree/lab3/1-port-net-standard-start/src/lab3-port-to-net-standard 來直接下載開始檔案。

測試現行AP
直接run起來,這是一個模擬找出所有在英國的員工並且列出來。
image

建立一個.Net Standard 1.6的lib,嘗試轉移出現錯誤 - 了解如何檢查api版本

LegacyApplication的sln點 右鍵 -> New Project,然後在彈出的畫面輸入:
  1. 先選擇 .Net Standard
  2. 再選Class Library(.net Standard)
  3. 輸入框Name:NorthwindDalNetStandard
image
這個時候會建立出一個.net standard的library專案
  1. NorthwindDalNetStandard右鍵
  2. 選擇 Properties
  3. Target Framework改成.Net Standrd 1.6
image
模擬建立出來的是.Net Standard 1.6的lib
LegacyApplication.View專案裡面把northwind.xmlNorthwindDal.cs複製一份到NorthwindDalNetStandard專案底下,最後結果如下
image
把專案 Build,會出現錯誤,發生DataSet找不到的情況
image
可以使用 .Net Api Browser來檢查api支援度
https://docs.microsoft.com/zh-tw/dotnet/api/?view=netstandard-1.6 - 會發現DataSet並不存在
image
而在 .Net Standard 2.0 有
  1. 點選 .Net Standard 1.6
  2. 選擇.Net Standard
  3. 選擇版本為2.0
  4. 可以看到就有支援DataSet
image
把Target從1.6轉回到2.0 在build就沒有問題了
image
northwind.xmlNorthwindDal.csLegacyApplication.View專案刪掉,並且把NorthwindDalNetStandard加入到reference,最後樣子如下:
image
最後,把LegacyApplication.View專案調整target framework
  1. LegacyApplication.View點右鍵
  2. 選擇Properties
  3. Target Framework改成.Net Framework 4.6.2
image

記得.Net Framework 4.6.2才有支援 .Net Standard 2.0嗎:http://immo.landwerth.net/netstandard-versions/#

把程式run起來,發現執行結果和之前一樣
image

建立一個.net core console使用建立出來的.Net Standard Lib

建立一個 .net core console 程式並且 reference 剛剛的 standard library
image
最後執行結果 - 出現錯誤
image

這個錯誤是Visual Studio已知的一個bug,原因是VS在執行的時候Working Directory放在了sln的位置,而不是bin的路徑,造成相對路徑檔案會找不到

預計 VS 2017.6會修正。相關issue: https://github.com/dotnet/project-system/issues/2239

改成用dotnet執行
  • 切換到bin下面
  • cmd執行:dotnet NetCoreConsole.dll
image

完整程式碼可以再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下載:下載鏈接

參考資料

.Net Standard和Runtime版本對應
http://immo.landwerth.net/netstandard-versions/#
.Net Api Browser - 檢查api支援度
https://docs.microsoft.com/zh-tw/dotnet/api/?view=netstandard-2.0
官方介紹port到standard建議執行方式
https://docs.microsoft.com/en-us/dotnet/core/porting/
comments powered by Disqus