有一个老项目,是用 .NET Framework 4.0 开发,在 web 页面调用并运行在 windows 上。 现在有一个需求:需要迁移到 arm 上运行。
我搜索了一下,解决方案是:
由于本人从未接触此类开发,所以有疑问想请教大佬:
感谢各位大佬!
经过指点,我现在算是对这个任务有了一个大概的了解,但是由于我现在
导致我无法进行更深层次的尝试。待我后期项目接手后有问题再来请教。
再次感谢!祝各位大佬工作顺利!
![]() |
1
luojianxhlxt 12 天前
如果 4.8.1 真的支持 arm ,那首选 1 ,代码基本不用改
|
![]() |
3
NightFlame 12 天前
用.net core ,不需要重写代码。
|
4
forgottencoast 12 天前
@NightFlame
一字不改,我是不信的。 |
![]() |
6
Yjhenan 12 天前 ![]() arm 架构的 Windows 系统吗?如果不是,那就迁移到 .NET Core 吧
|
![]() |
7
magic3584 OP @fzdfengzi #2
我之前搜索过,说是已经不维护了,所以正文方案里没有加这一项,不过可以尝试一下。 https://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. |
8
Mithril 12 天前 ![]() 还是要看你的项目核心功能在哪,有没有用到一些 Windows 独有的功能,或者一些和系统贴的很近的库。
虽然都是 Web 应用,但你这程序如果底层用了一些第三方的库,P/Invoke 了一些 C++或者用驱动读写了一些硬件,那大概率是转移不了的。 或者只是单纯的 Web 应用,但是那种非常传统的 ASP WebForm + IIS ,也用了一堆第三方控件。那迁移也是要重写的。即便是.NET 5 也没有这东西了。 如果网页结构不是很复杂,建议用.NET Core 自带的新 ASP 直接重写。前端使用现代的框架,Vue 或者 React ,不要用 Blazor 。这样你用 LLM 做 Vibe Coding 很快就能写个差不多的出来。 另外新的.NET 你可以直接在 Windows 或者其他开发机上写代码,编译的时候再选平台就行了。如果不带 runtime 的话取决于你用的库,纯托管的甚至都可以不选。 |
![]() |
10
opengps 12 天前
只能重写,用 .net7 比较稳妥
|
![]() |
12
yicong135 12 天前
如果引用的第三方库不一定支持 arm
|
![]() |
13
irisdev 12 天前
肯定是方案一,迁移到 net core 引用的第三方库的兼容性会把你搞死
|
![]() |
14
NightFlame 12 天前
@forgottencoast 如果不依赖于 windows 底层库的,用 IDE 选择新的.net core 框架,还要做改什么
|
![]() |
15
magic3584 OP |
![]() |
16
magic3584 OP @luojianxhlxt #1
wc !我问了 GPT ,说即使支持 arm 但是仍然只限于 windows! |
18
unhappy224 12 天前
可以试试 mono 应该大部分都没问题,之前我试过在 arm mac 下运行 .net 4.5 的 cli 程序,没什么问题
|
19
Mithril 12 天前 ![]() @magic3584 那很麻烦,如果这活不是砸死你头上了,建议不要接。
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 才行。 |
![]() |
20
lujiaxing 12 天前
这个要看情况. 如果你用了什么 Windows Only 的东西 (如 Windows API), 那大概率无解. 其他你可以考虑用 Mono 托管运行. arm 我没试过, x86 linux 确定以及肯定是可以跑 .NET Framework 开发的程序的.
|
![]() |
21
lujiaxing 12 天前 ![]() @magic3584 那你这都 P/Invoke 了大概率不得行. 除非你能找到相关 DLL 的 Linux 版. 否则这个是兼容不了的. 这个不是你们的问题, 是三方厂商的问题. 人家乐不乐意给你支持. 你接三方设备三方不给你支持麒麟系统那你做再多都是无意义的.
|
![]() |
22
magic3584 OP @Mithril #19
感谢大佬,这活跑不了,硬着头皮也要上的。🥲 我之前没表述清楚,项目情况是之前用 C#开发的依赖 .NET Framework 4.0 运行在 windows 上,现在需要迁移到 arm 的国产系统上运行。 您说的这个硬件问题,我估计得找第三方去提供下。那请问如果第三方没有的话这活是不是就没法干了?除非有源码自己去编译? 还有就是我开发测试的话,机器是只要 arm ubuntu 或者 arm windows 就行呢还是说必须是 arm 的国产化系统才可以? |
23
urlpha 12 天前 ![]() 这个项目应该通过以上楼主的技术评估后,在执行层面做一次研判:项目复杂度如何,团队成熟度如何(包括业务熟悉度、代码熟悉度两个维度),是否有迁移或改造预算,是否有后续升级的项目预算。
1 、如果项目复杂,建议不要动任何东西。可能没有太好的解法,有可能甲方写写情况说明可以继续使用,后续做个二期预算全部替代掉。也有可能只能中止。这完全是商务去考虑和推动的问题。 2 、如不复杂,且团队成熟、有适当的预算,项目迁移.net core 。一些迁移不了的重新开发。 3 、研判情形较多不一一列举了,综合考量,不排除换语言重新开发的可能性。 |
![]() |
25
icedx 12 天前
时不时可以考虑下 mono 或者 il2cpp
|
![]() |
26
magic3584 OP |
![]() |
27
sujin190 11 天前 ![]() @magic3584 #15 C++代码也是架构和系统绑定的啊,首先动态链接库 windows 叫 dll ,国产底层都是 linux 叫 so ,就算你有源码都不一定能在过程系统上编译出 so 来,这还有工具链、编译器版本和标准库依赖的问题,没源码的话就歇了吧
C#代码就算迁移到.net core 如果不是 asp.net 那一套估计工作量感觉还行,否则几乎等同于重写了吧 |
28
Mithril 11 天前 ![]() @magic3584 对,你得找供应商要这个 ARM 的国产系统对应的驱动和测试程序以及代码。如果他们不提供,那你根本做不了,不是说有测试程序或者驱动的代码重新编译就可以的。
国产系统大部分都是魔改 Linux ,所以你至少要找个 Linux 驱动才能开始你这活。厂家只提供 Windows 驱动的话,你这活没法做的。 Windows 和 Linux 的驱动模型不一样,你没法直接拿 Windows 驱动的代码编译一下就跑在 Linux 上。非常简单的通用设备可能还好点,找个通用的开源驱动改改就行了,但涉及到厂家定制的就没办法了,比如加密狗这种。 你用不惯国产系统开发,可以找个 ARM Linux ,然后找你那国产系统测试。最后即使跑不起来,修改量也不会很大,就是 Debug 级别,改改就行。但你找个 ARM Windows 的话,驱动接口测试程序啥的都不一样,改起来就太麻烦了。 |
![]() |
29
sujin190 11 天前
国产化系统基本上内核、标准库、编译器都很老了,这些货一个一个都完全没计划考虑定期升级个内核什么的,真是坑死个人的
|
30
nivalxer 11 天前 ![]() 最佳做法是迁移到.net core 。如果没有用到几个在.net core 中被废弃或者 windows 专有的一些功能
例如 wcf 不再支持(有第三方库可以支持)、system.drawing 命名空间下的图形处理相关的(有三方库可以支持) 因为提到的 web 程序,不涉及界面的话,整体迁移成本不大,是 mvc 的还是 mvc ,是 webapi 的还是 webapi 。 然后就可以一次编辑,全平台运行了。 |
![]() |
31
irisdev 11 天前
@magic3584 #17 迁到 linux+对接硬件?那很麻烦了,这么老的项目供应商都不一定还活着,还活着的大概率是没有适配麒麟的。界面倒是问题不大,反正你前端是 web 端。
|
32
tangmanger 11 天前 ![]() 直接升级 到.net 8 就行 前段刚试了 银河麒麟 国产 arm64 windows 下编译好 拷贝过去 启动
|
34
nivalxer 11 天前 ![]() 才看到提到了有硬件的 DLL 调用的话,那个是不行的,硬件驱动库 dll 除非对方提供其他操作系统下编译的产物,否则是调用不了的。
我们某些项目也存在类似情况,这种虽然用了.NET ,但是依然只能设置为在 windows 上运行。 |
![]() |
37
nieyujiang 11 天前
|
38
ConfusedBiscuit 11 天前 ![]() 当我看到了“有硬件交互”这几个字,我就知道,坏了,这不简单。
|
39
rogerhesong 11 天前 ![]() 我使用过 jexus 把.NET Framework4.5 的 web 项目迁移到 Linux 平台,目前运行还行,改动也不多
|
![]() |
40
chenxiansheng 11 天前 ![]() 如果是是为了运行,建议你可以在 arm 系统上弄个 wine 环境,这样不用重构代码简易很多
|
41
loveour 11 天前 ![]() @magic3584 前面有人回复讲的很清楚了。.net 本身迁移不说很简单,至少也不麻烦。最简单粗暴的,直接在 VS 里切环境,然后改报错就行。但是如果你们底层调用了哪些库,那些才是能不能迁移的关键。.net 可以跨平台,但是你们调用的库不一定可以,这个是你们这边的层面没法改的。所以要先调研那个,那个可以才可以进行下一步。
|
![]() |
42
magic3584 OP @chenxiansheng #40
claude 给了我这个选项,不过我看不是很稳定的样子 `3. Containerization with Wine (Not Recommended) Running Windows applications on Ubuntu using Wine - generally not suitable for production.` |
![]() |
44
linhua 11 天前 ![]() 前几个月刚用了 Jexus ,是.NET Framework 4.5 的 项目, 在 arm 服务器上,成功跑通了。
Jexus 是基于 mono 的 ,内部集成了 mono 可以运行 c#编译的 dll ,就是用 mono ,也可以用国产的 Jexus (这个比较方便,有问题可以加入 qq 群问,作者回复也挺及时)。 建议先仔细看完官网上的用户手册 https://www.jexus.org/Manuals 再提问 至于如果是 c++ 编译的 dll ,估计不太行。 因为 c#编译成的 dll,类似于 java 编译成的 class 文件,都是字节码,可以跨平台,跨架构。c++ 编译的 dll 就是 依赖于目标平台,目标架构了。 |
![]() |
45
guanzhangzhang 11 天前 ![]() 国产 arm 麒麟啥的是基于 yum 、apt 的 Linux 系统,你可以上 docker ,就是不知道客户接收 docker 不
|
![]() |
46
wccc 11 天前
建议甩锅 反正底层硬件的依赖 99.99% 不支持
|
![]() |
47
fzdfengzi 11 天前 ![]() |
48
roundgis 10 天前 via Android
試試看用 mono 能不能運行
不行就重寫 |