“我将 20 年前开发的操作系统迁移到 .NET 6,居然成功了”
时间:2023-08-18 06:07:00
作者 |Scott Hanselman
译者 | 弯月
出品 | CSDN(ID:CSDNnews)
早在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 3c4e05c787f588e940fe73bfa78d7eedfe0190bd We 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.我的直觉告诉我这里有问题,升级助手不明白。
我还注意到一个被注释的指向ILLink.Tasks引用,这是当年Mono该连接器的预览功能是压缩应用程序的最终尺寸,并切断无用代码。该功能已内置到.NET 6.以后用。所以这里不需要引用。
我决定直接升级到3720.NET 看看会发生什么。我只需要改变一个数字,看看它是否可以恢复和构建,但我也可以试试dotnetoutdated这个工具很好用:
这个“outdated工具妙妙在于它会调用NuGet检查一个包是否有新版本。
在测试中(此时只是一些批处理文件),我用以下方法调用dotnet:
dotnet netcoreapp2.0/TinyOSCore.dll 512 scott13.txt
之后会变成现代形式,只有TinyOSCore.exe 512 scott13.txt,只需要exe文件和参数不需要额外的东西。
发布和切割后,我的操作系统变成了只有15个MB的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