我将 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上运行,甚至能在树莓派等项目创立时尚未存在的机器上运行。

38bd905339fddd6c142eaa616c868ca5.png

在本文中,我想尝试一下能否利用.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

升级过程是交互式的命令行,使用了有颜色的提示信息,还有一系列带有动态选项的问题:

dad0c1c520bba630fc00ea78b0ae68ae.png

有意思的是,升级之后构建一次成功,没有任何错误。

手工检查.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工具,这个工具非常好用:

2fe6b2b8ef2628c2c6afc4fe11d1e88d.png

这个“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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bzoj2132: 圈地计划

要分成两坨对吧。。 所以显然最小割 但是不兹辞啊。。 最小割是最小的啊 求最大费用怎么玩啊 那咱们就把所有费用都加起来&#xff0c;减掉一个最小的呗 但是两个属于不同集合的点贡献的价值是负的啊 网络流怎么跑负的啊 那咱就交换一下呗 原图是二分图啊&#xff0c;把另一部分…

BEVFormerV2 论文阅读

论文链接 BEVFormer v2: Adapting Modern Image Backbones to Bird’s-Eye-View Recognition via Perspective Supervision 0. Abstract 提出了一种新颖的 BEV 检测器&#xff0c;具有透视监督&#xff0c;收敛速度更快&#xff0c;更适合现代图像基础架构优先考虑通过引入透…

光磁记录实现数据冷存储

通过一定强度的短脉冲可以在掺杂了钴离子的钇铁石榴石的磁性层上记录数据。据开发商介绍&#xff0c;这种新颖的光学存储机制有可能成为一种通用的、节能型数据存储技术&#xff0c;并替代现有的存储技术&#xff0c;这源于该技术能够完成超低热度的快速磁盘读写过程&#xff0…

aop在项目中的实际运用_【消防验收】防火玻璃在实际运用中的四大关键问题

扫码入群&#xff0c;与消防企业同行交流&#xff01;防火玻璃虽然开始在建筑中大量使用&#xff0c;但如何正确使用防火玻璃&#xff0c;使用哪种类型的防火玻璃&#xff0c;哪些部位可以使用防火玻璃等问题在实际运用中仍有很多盲区。同时&#xff0c;很多建设单位、设计单位…

CondenserDotNet - 使用 Kestrel 和 Consul 的 API 反向代理库!

简介CondenserDotNet - 使用 Kestrel 和 Consul 的 API 反向代理库&#xff01;特点•Consul 客户端库&#xff0c;包括服务注册、发现和配置•反向代理•交互式 UI&#xff0c;用于查看有关代理的统计信息配置示例配置遵循 LIFO 策略&#xff0c;以最后注册的配置为准var conf…

pdf转tiff

概述 基于Java&#xff0c;将pdf转成单一的tiff文件。 MAVEN依赖 <groupId>com.sun.media</groupId><artifactId>jai_codec</artifactId><version>1.1-mr</version> </dependency> <dependency><groupId>javax.media<…

配置PHP启动Apache服务报错

为什么80%的码农都做不了架构师&#xff1f;>>> 在新的服务器&#xff08;centos 6.3&#xff09;编译安装完php-5.4.8&#xff0c;再配置好php.ini和httpd.conf后&#xff0c;启动apache-2.4.3的时候&#xff0c;命令执行/usr/local/apache2/bin/apachectl start时…

嵌入式WiFi芯片价格战已经打响 MCU企业该醒悟了

在物联网万物互联的驱动下&#xff0c;无可厚非&#xff0c;嵌入式WiFi芯片市场成为了“引爆点”&#xff0c;预计2016年的总出货量将达到1亿颗。面对如此巨大的“诱惑”&#xff0c;国内外WiFi芯片企业自然干劲十足&#xff0c;本想好好大干一场。万万没想到&#xff0c;WiFi芯…

linux系统下图像处理开发板,Linux系统入门教程:五大图像处理软件

发文章时&#xff0c;总免不了要用图片说话。经过长时间的磨合&#xff0c;在Linux桌面系统下有几款图片处理软件我已经用得比较顺手了。这几款软件在Linux世界使用广泛&#xff0c;各个Linux发行版的软件仓库中都有自带的安装包&#xff0c;而且这几款软件运行稳定、界面美观。…

BZOJ1001 狼抓兔子 终于过了!

时间来不及了&#xff0c;先贴代码吧&#xff01;有时间再写。 好苦逼啊&#xff0c;WA了若干次&#xff0c;还有一次RE&#xff0c;一次TLE。 虽然主要运用的算法和资料都由师兄提供了。还是太弱了&#xff0c;太天真了。 首先&#xff0c;数据范围就WA了&#xff0c;RE了&…

如何使用GeneralUpdte构建客户端自动升级功能

一、概要本篇文章将向各位小伙伴介绍GeneralUpdate组件的使用&#xff0c;帮助第一次接触开发者快速上手应用在自己或企业项目中。如果本篇文章对您有帮助&#xff0c;希望帮忙点一下star。感谢各位开发者的支持。帮助文档讲解视频&#xff1a;https://www.bilibili.com/video/…

30道四则运算题目---课堂作业--软件工程c++

问题&#xff1a;设计一程序&#xff0c;给二年级小学生随机产生四则运算题目。 一、设计思考问题&#xff1a; 1.四则运算需要俩个运算数和一个运算符。 2.如何产生随机数? 3.如何实现随机产生四则运算&#xff1f; 4.题目是否符合小学生学习范围&#xff1f;&#xff08;减法…

javascript 函数属性prototype(转)

在JavaScript中并没有类的概念&#xff0c;但javascript中的确可以实现重载&#xff0c;多态&#xff0c;继承。这些实现其实方法都可以用JavaScript中的引用和变量作用域结合prototype来解释。 1、prototype 在JavaScript中并没有类的概念&#xff0c;但JavaScript中的确可以实…

java离职交接文档_财务人员工作交接你知道么?没处理好不止将来风险大还可能违法...

今天给大家分享一下在工作中&#xff0c;财务人员应该怎么保护自己&#xff1f;1.虚假报销那些事儿在企业内部报销程序中&#xff0c;部分管理人员往往安排下属或助理经办报销程序&#xff0c;所有的费用申请、报销单据的填写均系下属完成&#xff0c;而一旦虚假报销案件浮出水…

SQL Server 数据库没有有效所有者的三种解决办法

问题描述: 开发的过程中,操作系统出了问题,决定重装系统。但是没有将SQL Server中的数据库文件分离出来,直接将系统格了。在新系统数据库中附加了数据库文件,一切还算正常,但当打开数据库关系图的时候出现了问题,如下图所示: 针对以上问题,网上有很多解决办法,但是由…

Javascript:原型模式类继承

原型模式每个函数&#xff08;准确说不是类、对象&#xff09;都有一个prototype属性&#xff0c;这个属性是一个指针&#xff0c;指向一个对象。使用原型对象的好处是可以让所有对象实例共享它包含的属性和方法。1.原型对象&#xff08;1&#xff09;当创建一个新函数&#xf…

C# 学习经验分享

NET 20 周年的学习挑战赛刚结束了第⼀阶段&#xff0c;不知道各位⼩伙伴参加了没有&#xff1f;有⼈问现在学习 C# 是不是有点过时&#xff1f;也有⼈问现在C# 能做什么&#xff1f;更有⼈问学习 C# 能否找到⼯作 &#xff1f;或者你从不同的专家&#xff0c;不同的从业者可以有…

有限服务器延时计算_机房设备功率统计,UPS不间断电源和蓄电池的计算选择

当然了&#xff0c;也可以不用这么麻烦&#xff0c;网上有UPS计算器的&#xff0c;输入条件直接求个结果就行了。弱电笔记&#xff5c;弱电&#xff08;安防&#xff09;计算器诺&#xff0c;就上面那个&#xff01;下面进入正文&#xff1a;一个计算机机房有4台PC机&#xff0…

linux把2块盘挂到一个分区,linux系统如何挂载第二块硬盘

云主机有两块硬盘&#xff0c;第一块硬盘盘一般为10G&#xff0c;用于安装系统&#xff0c;第二块磁盘根据云主机类型不同&#xff0c;大小也不相同。我们建议您在使用的时候第二块硬盘作为数据盘&#xff0c;存放你的网站数据&#xff0c;这样在您恢复系统的时候&#xff0c;数…

Visual Studio/SQL Server系统开发常见问题归纳

问题1.在利用C Sharp(操作系统为Windows7 64位)将Excel数据导入到SQL Server 2005中时,出现如下提示: 解决办法:VS菜单栏 生成→“配置管理器→平台→新建→x86。