请教个 .NET Framework 4.0 升级以运行在 arm 上的问题
有一个老项目,是用 .NET Framework 4.0 开发,在 web 页面调用并运行在 windows 上。
现在有一个需求:需要迁移到 arm 上运行。
我搜索了一下,解决方案是:
升级到 .NET Framework 4.8.1 及以后版本,原生支持 arm
用 .NET Core (.NET 或者 ASP.NET ) 重写
由于本人从未接触此类开发,所以有疑问想请教大佬:
以上哪种方案对于我来说是比较省心的
我是否必须要在 arm 架构的机器上开发,比如 MacOS 、arm Ubuntu ,如果用树莓派是否可行。
我麻了大佬们,升级解决不了问题!
- .NET Framework 4.8.1 support arm64 ,可以运行在 ubuntu 上吗
- 这个问题问得很到位 👌
先分清楚概念:
⸻
📌 .NET Framework 4.8.1
• 这是 传统的 .NET Framework 的最后一个版本( 2022 年发布)。
• 特点:
• 只能运行在 Windows 操作系统 上。
• 支持 x86 / x64 / ARM64 架构(比如 Windows on ARM 的 Surface Pro X )。
• 所以即使它支持 arm64 CPU ,依然 仅限 Windows 平台。
⸻
📌 那能不能在 Ubuntu 上运行?
不行。原因:
• .NET Framework 是 Windows 专属,依赖 Windows 的 CLR (公共语言运行库)、Win32 API 、WPF 、WinForms 等技术。
• Ubuntu 是 Linux 系统,直接不兼容。
⸻
📌 那在 Linux/Ubuntu 上要怎么办?
• 你需要用 .NET Core 或 .NET 5/6/7/8 (统一后的 .NET 平台)。
• 这些版本是 跨平台的,原生支持 Windows / Linux / macOS ,而且也支持 arm64 (比如树莓派、ARM 服务器)。
⸻
✅ 总结:
• .NET Framework 4.8.1 = Windows Only (支持 arm64 ,但只能 Windows )。
• .NET Core / .NET 5+ = 跨平台( Windows / Linux / macOS ,支持 x64 和 arm64 )。
抱歉误导大佬们了,我没有说清楚。
之前是用 C#开发的依赖 .NET Framework 4.0 运行在 windows 上,现在需要迁移到 arm 的国产系统上运行。
如果 4.8.1 真的支持 arm ,那首选 1 ,代码基本不用改
可以在树莓派上安装 mono 环境,直接运行.NET Framework 程序。开发环境不用变
用.net core ,不需要重写代码。
一字不改,我是不信的。
如果不是桌面端应用,应该还是比较好迁移的,用.net core ,前期可能修改的比较多,后期维护更好
arm 架构的 Windows 系统吗?如果不是,那就迁移到 .NET Core 吧
#2
我之前搜索过,说是已经不维护了,所以正文方案里没有加这一项,不过可以尝试一下。
www.mono-project.com/download/stable/
The last major release of the Mono Project was in July 2019, with minor patch releases since that time. The last patch release was February 2024.
还是要看你的项目核心功能在哪,有没有用到一些 Windows 独有的功能,或者一些和系统贴的很近的库。
虽然都是 Web 应用,但你这程序如果底层用了一些第三方的库,P/Invoke 了一些 C++或者用驱动读写了一些硬件,那大概率是转移不了的。
或者只是单纯的 Web 应用,但是那种非常传统的 ASP WebForm + IIS ,也用了一堆第三方控件。那迁移也是要重写的。即便是.NET 5 也没有这东西了。
如果网页结构不是很复杂,建议用.NET Core 自带的新 ASP 直接重写。前端使用现代的框架,Vue 或者 React ,不要用 Blazor 。这样你用 LLM 做 Vibe Coding 很快就能写个差不多的出来。
另外新的.NET 你可以直接在 Windows 或者其他开发机上写代码,编译的时候再选平台就行了。如果不带 runtime 的话取决于你用的库,纯托管的甚至都可以不选。
#6
不是,是麒麟。
我只知道架构会有影响,这个系统也会有影响吗?
只能重写,用 .net7 比较稳妥
#10 大部分代码都是直接拷贝,但总会有些引用库可能不支持.net7 需要替换或者自己补充逻辑重新实现
如果引用的第三方库不一定支持 arm
肯定是方案一,迁移到 net core 引用的第三方库的兼容性会把你搞死
如果不依赖于 windows 底层库的,用 IDE 选择新的.net core 框架,还要做改什么
#8
我也不清楚用了什么库,现在只知道之前项目用 C# 依赖了.NET Framework 4.0 ,然后在一个网页里面调用的,其中有硬件交互。
虽然都是 Web 应用,但你这程序如果底层用了一些第三方的库,P/Invoke 了一些 C++或者用驱动读写了一些硬件,那大概率是转移不了的
我理解的是把库和相关方法替换掉就行了,C++那些代码我不用动。所以我不太懂为什么转移不了,请大佬指点。
#1
wc !我问了 GPT ,说即使支持 arm 但是仍然只限于 windows!
#13
抱歉误导大佬了,我搜了下即使升级也是只支持 windows, 现在我是想跑在 arm 的国产系统上
可以试试 mono 应该大部分都没问题,之前我试过在 arm mac 下运行 .net 4.5 的 cli 程序,没什么问题
那很麻烦,如果这活不是砸死你头上了,建议不要接。
C++,还是硬件驱动,是大概率没法直接二进制跨平台的。你至少也需要重新编译才行。你这.NET Framework 4.0 的项目估计已经很老了,你找对应硬件的 ARM 平台和系统驱动,C++代码就得找半天。找到代码了,编译测试好了,才是你.NET 代码的事。这还是不算你 C++代码根本没法跨平台的事。你那 C++部分要是用了什么 ATL ,MFC ,或者一堆 Windows API ,迁移它还不如重新找个供应商。
然后你得测试从 C#代码里调用你 C++的 Wrapper ,这个你怎么都要改(至少 Linux 上你的库大概率不叫 x.dll )。这个测试你得用对应平台才行。比如你用 ARM 的 Ubuntu ,甚至用 ARM 的 Windows 11 ,也得找个测试机才可以。
最后才是你那 Web App ,迁移这层相对来说是最简单的了。
所以你以为是迁移一个 Web 应用到 ARM 平台,实际上是一整个大深坑。而且最难的根本不在.NET 部分,而是你要把你硬件那堆东西先迁移到 ARM 才行。
这个要看情况. 如果你用了什么 Windows Only 的东西 (如 Windows API), 那大概率无解. 其他你可以考虑用 Mono 托管运行. arm 我没试过, x86 linux 确定以及肯定是可以跑 .NET Framework 开发的程序的.
那你这都 P/Invoke 了大概率不得行. 除非你能找到相关 DLL 的 Linux 版. 否则这个是兼容不了的. 这个不是你们的问题, 是三方厂商的问题. 人家乐不乐意给你支持. 你接三方设备三方不给你支持麒麟系统那你做再多都是无意义的.
#19
感谢大佬,这活跑不了,硬着头皮也要上的。🥲
我之前没表述清楚,项目情况是之前用 C#开发的依赖 .NET Framework 4.0 运行在 windows 上,现在需要迁移到 arm 的国产系统上运行。
您说的这个硬件问题,我估计得找第三方去提供下。那请问如果第三方没有的话这活是不是就没法干了?除非有源码自己去编译?
还有就是我开发测试的话,机器是只要 arm ubuntu 或者 arm windows 就行呢还是说必须是 arm 的国产化系统才可以?
这个项目应该通过以上楼主的技术评估后,在执行层面做一次研判:项目复杂度如何,团队成熟度如何(包括业务熟悉度、代码熟悉度两个维度),是否有迁移或改造预算,是否有后续升级的项目预算。
1 、如果项目复杂,建议不要动任何东西。可能没有太好的解法,有可能甲方写写情况说明可以继续使用,后续做个二期预算全部替代掉。也有可能只能中止。这完全是商务去考虑和推动的问题。
2 、如不复杂,且团队成熟、有适当的预算,项目迁移.net core 。一些迁移不了的重新开发。
3 、研判情形较多不一一列举了,综合考量,不排除换语言重新开发的可能性。
是 所以这东西最关键的问题并不是技术问题 而是你的合作硬件供应商乐不乐意支持的问题
时不时可以考虑下 mono 或者 il2cpp
#21
大佬您的意思是如果第三方硬件不支持麒麟的话我即使用 Mono 也跑不了吗?
我一点不了解 windows 开发,问题可能有点低级,抱歉
#15 C++代码也是架构和系统绑定的啊,首先动态链接库 windows 叫 dll ,国产底层都是 linux 叫 so ,就算你有源码都不一定能在过程系统上编译出 so 来,这还有工具链、编译器版本和标准库依赖的问题,没源码的话就歇了吧
C#代码就算迁移到.net core 如果不是 asp.net 那一套估计工作量感觉还行,否则几乎等同于重写了吧
对,你得找供应商要这个 ARM 的国产系统对应的驱动和测试程序以及代码。如果他们不提供,那你根本做不了,不是说有测试程序或者驱动的代码重新编译就可以的。
国产系统大部分都是魔改 Linux ,所以你至少要找个 Linux 驱动才能开始你这活。厂家只提供 Windows 驱动的话,你这活没法做的。
Windows 和 Linux 的驱动模型不一样,你没法直接拿 Windows 驱动的代码编译一下就跑在 Linux 上。非常简单的通用设备可能还好点,找个通用的开源驱动改改就行了,但涉及到厂家定制的就没办法了,比如加密狗这种。
你用不惯国产系统开发,可以找个 ARM Linux ,然后找你那国产系统测试。最后即使跑不起来,修改量也不会很大,就是 Debug 级别,改改就行。但你找个 ARM Windows 的话,驱动接口测试程序啥的都不一样,改起来就太麻烦了。
国产化系统基本上内核、标准库、编译器都很老了,这些货一个一个都完全没计划考虑定期升级个内核什么的,真是坑死个人的
最佳做法是迁移到.net core 。如果没有用到几个在.net core 中被废弃或者 windows 专有的一些功能
例如 wcf 不再支持(有第三方库可以支持)、system.drawing 命名空间下的图形处理相关的(有三方库可以支持)
因为提到的 web 程序,不涉及界面的话,整体迁移成本不大,是 mvc 的还是 mvc ,是 webapi 的还是 webapi 。
然后就可以一次编辑,全平台运行了。
#17 迁到 linux+对接硬件?那很麻烦了,这么老的项目供应商都不一定还活着,还活着的大概率是没有适配麒麟的。界面倒是问题不大,反正你前端是 web 端。
直接升级 到.net 8 就行 前段刚试了 银河麒麟 国产 arm64 windows 下编译好 拷贝过去 启动
#31
如果是第三方不支持的话,那就不是我们的锅了。😂
Learn Python The Hard Way (pdf) Learn Python The Hard Way Programming Windows Phone 7 …
淘宝这种算吗 淘宝跟设计精良就不沾边 Apple 官网算吧 算 一打开卡就算 淘宝设计很多问题,举个例子: 上面的图片是淘宝首页的工具栏,我的鼠标点击后,…
关键是名字还是个 HCDN ,不由得让人多想 如图 imgloc.com/i/H1iza 小米盒子会有这个用来跑边缘计算,盗用用户的网络带宽进行 P2P 上传。现在手机也有…