天天看點

你知道嗎,怎麼更好的遷移.NET Framework 的老舊項目?

作者:opendotnet
  • 📢歡迎點贊 :👍 收藏 ⭐留言 📝 如有錯誤敬請指正,賜人玫瑰,手留餘香!
  • 📢本文作者:由webmote 原創
  • 📢作者格言:新的征程,我們面對的不是技術而是人心,人心不可測,海水不可量,唯有技術,才是深沉黑夜中的一座閃爍的燈塔 !

序言

你知道嗎,怎麼更好的遷移.NET Framework 的老舊項目?

如果你接管了别人的園子,不管什麼原因,總有一堆坐落在園中的器物,或是古舊假山,或是年舊失修的池塘,又或是不合時宜的零散花卉。

當你扛起鋤頭,想對這些舊物下手的時候,最好等等,先坐在旁邊的涼椅上,打開Apple中的正念,閉上眼睛,想想下之前的主人,為什麼這樣做。

而我現在,面對就是類似的情景,隻不過接手的不是園子,而是來自于遠古時期的.Net Framework4.5的項目…

1. 為什麼更新

項目目前使用VS2015管理,當然如果使用VS2022打開也不是辦不到,稍微調整下.net Framework的支援,還是很容易做得到的。

老舊主人,應該也不是一個懷舊的人,不是不願意看到新的事物發生,而是在舊有的圈子裡,已經進入到一個舒适的狀态,是以就沒有大的動力進行革新,為什麼需要花費更多的時間在不産生更多價值,或者是明顯價值的事情上呢?

并且一旦進行革新,必然會遇到更多未知的風險,這些風險點,當然是可以解決的,但時間和精力的付出也是必要的,在沒有更多壓力的情況下,一動不如一靜!

我臆測着老舊主人的心理,大概也不一定準确,隻是給自己的行動找到支援的理由而已。每個人都在為自己的行為找各種理由,以滿足自己就是行動正确性的心理。

2. 行動

已經有足夠的理由說服自己了,那麼就行動起來。

我給自己制定了一條路線:

  1. 更新編輯器為宇宙第一的 VS2022;

2. 更新項目為.NET 6 ,不幸的是,該計劃夭折了,原因可能就是動作太大,扯到蛋了。

  1. 更新項目為 .NET Framework 4.7
  2. 更新類庫為 .Net Standard 2.0
  3. 坐等結果

2.1 更新編輯器

借圖一張,希望莫怪,如果需要支援4.5架構,那麼還是需要一些步驟的。

這裡有個教程,請參考:更新架構庫

你知道嗎,怎麼更好的遷移.NET Framework 的老舊項目?

2.2 更新項目為 .NET Framework 4.7

修改解決方案檔案,更改目标為4.7

<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
           

修改App.config檔案

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
<runtime>
<!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false' -->
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false" />
</runtime>
</configuration>
           

修改nuget封包件 package.config内的包目标為

package id="WebActivatorEx" version="2.1.0" targetFramework="net472" />
           

2.3 更新類庫

這個步驟不是必須的,新的類庫可以建構為 net standard類型,注意需要2.0版本。

<TargetFrameworks>net472;netstandard2.0</TargetFrameworks>
           

3. 坐等結果

如果一切順利,到這裡應該可以結束了。

不過有一個新的地方需要特别注意,這裡會出現許多的問題。

包引用,類庫沖突等問題。

由于就項目采用package.config來管理nuget包,而這種方式在VS2017時已經被更新為 PackageReference 方式。

預設情況下,PackageReference 用于 .NET Core 項目、.NET Standard 項目,以及面向 Windows 10 Build 15063及更高版本的 UWP 項目(C++ UWP 項目除外)。

.NET Framework項目支援 PackageReference,但目前預設為 packages.config。若要使用 PackageReference,請将 packages.config 中的依賴項遷移到項目檔案中,然後删除 packages.config。

在項目檔案内表現為:

<ItemGroup>
<!-- ... -->
<PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0" />
<!-- ... -->
</ItemGroup>
           

在VS内的選項中,可以配置預設包類型,如圖修改:

你知道嗎,怎麼更好的遷移.NET Framework 的老舊項目?

該方式的優勢集中在如下方面:

  • 在一個位置管理所有項目依賴項:與項目的引用和程式集引用一樣,NuGet 包引用(使用 PackageReference 節點)直接在項目檔案中進行管理,而不是使用單獨的 packages.config 檔案進行管理。
  • 頂級依賴項的有序視圖:與 packages.config 不同,PackageReference 僅列出那些直接安裝在項目中的 NuGet 包。是以,NuGet 包管理器的項目檔案不會與低級依賴項混在一起。
  • 性能改進:使用 PackageReference 時,包保留在 global-packages 檔案夾中(而不是解決方案中的 packages 檔案夾中), 是以,PackageReference 的執行速度更快,但占用的磁盤空間更少。
  • 更好地控制依賴項和内容流:使用 MSBuild 的現有功能可以有條件地引用 NuGet 包,并選擇每個目标架構、配置、平台或其他透視的包引用。

如何更新呢?

  1. 在“解決方案資料總管”中,右鍵單擊“引用”節點或 packages.config 檔案,然後選擇“将 packages.config 遷移到 PackageReference…” 。
  2. 檢查任何的内容資産,修改為 contentFiles

    包的 content 檔案夾中的資産不受 PackageReference 支援,并且将被忽略。PackageReference 添加了對 contentFiles 的支援,以便獲得更好的可傳遞支援和共享内容。潛在影響:content 中的資産不會複制到項目中,依賴于這些資産的項目代碼需要重構

4. 編譯,修正錯誤

做完了上述作業,進行整體編譯。

修正任何引用庫的問題。

祝你順利!

結語

希望你能在你自己的花園裡翺翔,直到這個花園不再屬于你。

👓都收藏了,還在乎一個評論嗎?

繼續閱讀