我将 20 年前开发的操作系统迁移到 .NET 6,竟然成功了!
作者 |?Scott Hanselman
譯者 | 彎月
早在2001年,我用C#為學校的一門300系列的操作系統課程編寫了一個微型虛擬操作系統,后來在2002年將其移植到了VB.NET。這些都是在.NET Core出現之前的代碼,基于Windows早期的.NET 1.1或2.0。
五年前,我將代碼轉移到了GitHub上,同時將項目移植到了.NET Core 2.0。當時這個項目已經有15年歷史了,所以這個項目能在Windows、Linux、Docker上運行,甚至能在樹莓派等項目創立時尚未存在的機器上運行。
在本文中,我想嘗試一下能否利用.NET升級助手,將這個已有20年歷史的項目搬到.NET 6上運行。
下面,我們開始:
$ upgrade-assistant upgrade .\TinyOS.sln ----------------------------------------------------------------------------------------------------------------- Microsoft .NET Upgrade Assistant v0.3.256001+3c4e05c787f588e940fe73bfa78d7eedfe0190bdWe are interested in your feedback! Please use thefollowing link to open a survey: https://aka.ms/DotNetUASurvey -----------------------------------------------------------------------------------------------------------------[22:58:01 INF] Loaded 5 extensions [22:58:02 INF] Using MSBuild from C:\ProgramFiles\dotnet\sdk\6.0.100\ [22:58:02 INF] Using Visual Studio install from C:\ProgramFiles\Microsoft Visual Studio\2022\Preview [v17] [22:58:06 INF] Initializing upgrade step Select anentrypoint [22:58:07 INF] Setting entrypoint to only project insolution: C:\Users\scott\TinyOS\src\TinyOSCore\TinyOSCore.csproj [22:58:07 INF] Recommending executable TFM net6.0 becausethe project builds to an executable [22:58:07 INF] Initializing upgrade step Select project toupgrade [22:58:07 INF] Recommending executable TFM net6.0 becausethe project builds to an executable [22:58:07 INF] Recommending executable TFM net6.0 becausethe project builds to an executable [22:58:07?INF]?Initializing?upgrade?step?Back?up?project升級過程是交互式的命令行,使用了有顏色的提示信息,還有一系列帶有動態選項的問題:
有意思的是,升級之后構建一次成功,沒有任何錯誤。
手工檢查.csproj文件時,我發現了一些奇怪的數字,很像是來自多年前的.NET Core 2。我的直覺告訴我這里有問題,而升級助手并沒有理解。
<!-- <PackageReference Include="ILLink.Tasks" Version="0.1.4-preview-906439" /> --> <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.0.0-preview2-final" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.0.0-preview2-final" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.0.0-preview2-final" /> <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.0.0-preview2-final" />我還注意到一個被注釋掉的指向ILLink.Tasks的引用,這是當年Mono的連接器的一個預覽功能,目的是壓縮應用程序的最終大小,并裁剪掉無用的代碼。這項功能已經內置到.NET 6中,后面會用到。所以這里不需要這個引用了。
我決定先不管三七二十一直接升級到.NET 6看看會怎樣。我只需要改一個數字,看看能否恢復并構建,但也可以嘗試一下dotnetoutdated工具,這個工具非常好用:
這個“outdated”工具妙就妙在它會調用NuGet來查看某個包是否有新版本。
在測試中(此時只不過是一些批處理文件),我采用如下方式調用dotnet:
dotnet netcoreapp2.0/TinyOSCore.dll 512 scott13.txt之后會改成現代形式,只有TinyOSCore.exe 512 scott13.txt,只需要exe文件和參數,不需要額外的東西。
經過發布和裁剪后,我的操作系統變成了一個僅有15MB的exe文件。考慮到.NET已存在,不需要額外安裝,這個結果已經很優秀了。如果我愿意,甚至可以將這個操作系統變成一個微服務:
dotnet publish -r win-x64 --self-contained -p:PublishSingleFile=true-p:SuppressTrimAnalysisWarnings=true如果加上:
-p:EnableCompressionInSingleFile=true還能進一步縮小。不需要修改任何代碼。測試也都通過了。當年為學校編寫的 .NET 1.1 現在都移植到了 .NET 6.0上,而且還能跨平臺,自帶運行時,而且只包含一個僅有11MB的EXE文件。
參考鏈接:
https://www.hanselman.com/blog/upgrading-a-20-year-old-university-project-to-net-6-with-dotnetupgradeassistant
總結
以上是生活随笔為你收集整理的我将 20 年前开发的操作系统迁移到 .NET 6,竟然成功了!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Xamarin效果第十七篇之AR GIS
- 下一篇: CondenserDotNet - 使用