V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rrubick
V2EX  ›  .NET

请教个 .NET Framework 4.0 升级以运行在 arm 上的问题

  •  
  •   rrubick · 2025 年 8 月 26 日 · 3953 次点击
    这是一个创建于 144 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个老项目,是用 .NET Framework 4.0 开发,在 web 页面调用并运行在 windows 上。 现在有一个需求:需要迁移到 arm 上运行。

    我搜索了一下,解决方案是:

    1. 升级到 .NET Framework 4.8.1 及以后版本,原生支持 arm
    2. 用 .NET Core (.NET 或者 ASP.NET ) 重写

    由于本人从未接触此类开发,所以有疑问想请教大佬:

    1. 以上哪种方案对于我来说是比较省心的
    2. 我是否必须要在 arm 架构的机器上开发,比如 MacOS 、arm Ubuntu ,如果用树莓派是否可行。
    第 1 条附言  ·  2025 年 8 月 26 日
    我麻了大佬们,升级解决不了问题!

    - .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 )。
    第 2 条附言  ·  2025 年 8 月 26 日
    抱歉误导大佬们了,我没有说清楚。

    之前是用 C#开发的依赖 .NET Framework 4.0 运行在 windows 上,现在需要迁移到 arm 的国产系统上运行。
    第 3 条附言  ·  2025 年 8 月 26 日

    感谢各位大佬!

    经过指点,我现在算是对这个任务有了一个大概的了解,但是由于我现在

    1. 没有拿到代码
    2. 客户设备与系统情况未知

    导致我无法进行更深层次的尝试。待我后期项目接手后有问题再来请教。

    再次感谢!祝各位大佬工作顺利!

    49 条回复    2025-08-27 12:09:03 +08:00
    luojianxhlxt
        1
    luojianxhlxt  
       2025 年 8 月 26 日
    如果 4.8.1 真的支持 arm ,那首选 1 ,代码基本不用改
    fzdfengzi
        2
    fzdfengzi  
       2025 年 8 月 26 日
    可以在树莓派上安装 mono 环境,直接运行.NET Framework 程序。开发环境不用变
    89adc64
        3
    89adc64  
       2025 年 8 月 26 日
    用.net core ,不需要重写代码。
    forgottencoast
        4
    forgottencoast  
       2025 年 8 月 26 日
    @NightFlame
    一字不改,我是不信的。
    ration
        5
    ration  
       2025 年 8 月 26 日
    如果不是桌面端应用,应该还是比较好迁移的,用.net core ,前期可能修改的比较多,后期维护更好
    Yjhenan
        6
    Yjhenan  
       2025 年 8 月 26 日   ❤️ 1
    arm 架构的 Windows 系统吗?如果不是,那就迁移到 .NET Core 吧
    rrubick
        7
    rrubick  
    OP
       2025 年 8 月 26 日
    @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.
    Mithril
        8
    Mithril  
       2025 年 8 月 26 日   ❤️ 1
    还是要看你的项目核心功能在哪,有没有用到一些 Windows 独有的功能,或者一些和系统贴的很近的库。

    虽然都是 Web 应用,但你这程序如果底层用了一些第三方的库,P/Invoke 了一些 C++或者用驱动读写了一些硬件,那大概率是转移不了的。

    或者只是单纯的 Web 应用,但是那种非常传统的 ASP WebForm + IIS ,也用了一堆第三方控件。那迁移也是要重写的。即便是.NET 5 也没有这东西了。

    如果网页结构不是很复杂,建议用.NET Core 自带的新 ASP 直接重写。前端使用现代的框架,Vue 或者 React ,不要用 Blazor 。这样你用 LLM 做 Vibe Coding 很快就能写个差不多的出来。

    另外新的.NET 你可以直接在 Windows 或者其他开发机上写代码,编译的时候再选平台就行了。如果不带 runtime 的话取决于你用的库,纯托管的甚至都可以不选。
    rrubick
        9
    rrubick  
    OP
       2025 年 8 月 26 日
    @Yjhenan #6
    不是,是麒麟。
    我只知道架构会有影响,这个系统也会有影响吗?
    opengps
        10
    opengps  
       2025 年 8 月 26 日
    只能重写,用 .net7 比较稳妥
    opengps
        11
    opengps  
       2025 年 8 月 26 日
    @opengps #10 大部分代码都是直接拷贝,但总会有些引用库可能不支持.net7 需要替换或者自己补充逻辑重新实现
    yicong135
        12
    yicong135  
       2025 年 8 月 26 日
    如果引用的第三方库不一定支持 arm
    irisdev
        13
    irisdev  
       2025 年 8 月 26 日
    肯定是方案一,迁移到 net core 引用的第三方库的兼容性会把你搞死
    89adc64
        14
    89adc64  
       2025 年 8 月 26 日
    @forgottencoast 如果不依赖于 windows 底层库的,用 IDE 选择新的.net core 框架,还要做改什么
    rrubick
        15
    rrubick  
    OP
       2025 年 8 月 26 日
    @Mithril #8
    我也不清楚用了什么库,现在只知道之前项目用 C# 依赖了.NET Framework 4.0 ,然后在一个网页里面调用的,其中有硬件交互。

    虽然都是 Web 应用,但你这程序如果底层用了一些第三方的库,P/Invoke 了一些 C++或者用驱动读写了一些硬件,那大概率是转移不了的
    ------------------
    我理解的是把库和相关方法替换掉就行了,C++那些代码我不用动。所以我不太懂为什么转移不了,请大佬指点。
    rrubick
        16
    rrubick  
    OP
       2025 年 8 月 26 日
    @luojianxhlxt #1
    wc !我问了 GPT ,说即使支持 arm 但是仍然只限于 windows!
    rrubick
        17
    rrubick  
    OP
       2025 年 8 月 26 日
    @irisdev #13
    抱歉误导大佬了,我搜了下即使升级也是只支持 windows, 现在我是想跑在 arm 的国产系统上
    unhappy224
        18
    unhappy224  
       2025 年 8 月 26 日
    可以试试 mono 应该大部分都没问题,之前我试过在 arm mac 下运行 .net 4.5 的 cli 程序,没什么问题
    Mithril
        19
    Mithril  
       2025 年 8 月 26 日   ❤️ 3
    @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 才行。
    lujiaxing
        20
    lujiaxing  
       2025 年 8 月 26 日
    这个要看情况. 如果你用了什么 Windows Only 的东西 (如 Windows API), 那大概率无解. 其他你可以考虑用 Mono 托管运行. arm 我没试过, x86 linux 确定以及肯定是可以跑 .NET Framework 开发的程序的.
    lujiaxing
        21
    lujiaxing  
       2025 年 8 月 26 日   ❤️ 1
    @magic3584 那你这都 P/Invoke 了大概率不得行. 除非你能找到相关 DLL 的 Linux 版. 否则这个是兼容不了的. 这个不是你们的问题, 是三方厂商的问题. 人家乐不乐意给你支持. 你接三方设备三方不给你支持麒麟系统那你做再多都是无意义的.
    rrubick
        22
    rrubick  
    OP
       2025 年 8 月 26 日
    @Mithril #19
    感谢大佬,这活跑不了,硬着头皮也要上的。🥲

    我之前没表述清楚,项目情况是之前用 C#开发的依赖 .NET Framework 4.0 运行在 windows 上,现在需要迁移到 arm 的国产系统上运行。

    您说的这个硬件问题,我估计得找第三方去提供下。那请问如果第三方没有的话这活是不是就没法干了?除非有源码自己去编译?
    还有就是我开发测试的话,机器是只要 arm ubuntu 或者 arm windows 就行呢还是说必须是 arm 的国产化系统才可以?
    urlpha
        23
    urlpha  
       2025 年 8 月 26 日   ❤️ 1
    这个项目应该通过以上楼主的技术评估后,在执行层面做一次研判:项目复杂度如何,团队成熟度如何(包括业务熟悉度、代码熟悉度两个维度),是否有迁移或改造预算,是否有后续升级的项目预算。
    1 、如果项目复杂,建议不要动任何东西。可能没有太好的解法,有可能甲方写写情况说明可以继续使用,后续做个二期预算全部替代掉。也有可能只能中止。这完全是商务去考虑和推动的问题。
    2 、如不复杂,且团队成熟、有适当的预算,项目迁移.net core 。一些迁移不了的重新开发。
    3 、研判情形较多不一一列举了,综合考量,不排除换语言重新开发的可能性。
    lujiaxing
        24
    lujiaxing  
       2025 年 8 月 26 日
    @magic3584 是 所以这东西最关键的问题并不是技术问题 而是你的合作硬件供应商乐不乐意支持的问题
    icedx
        25
    icedx  
       2025 年 8 月 26 日
    时不时可以考虑下 mono 或者 il2cpp
    rrubick
        26
    rrubick  
    OP
       2025 年 8 月 26 日
    @lujiaxing #21
    大佬您的意思是如果第三方硬件不支持麒麟的话我即使用 Mono 也跑不了吗?
    我一点不了解 windows 开发,问题可能有点低级,抱歉
    sujin190
        27
    sujin190  
       2025 年 8 月 26 日   ❤️ 1
    @magic3584 #15 C++代码也是架构和系统绑定的啊,首先动态链接库 windows 叫 dll ,国产底层都是 linux 叫 so ,就算你有源码都不一定能在过程系统上编译出 so 来,这还有工具链、编译器版本和标准库依赖的问题,没源码的话就歇了吧

    C#代码就算迁移到.net core 如果不是 asp.net 那一套估计工作量感觉还行,否则几乎等同于重写了吧
    Mithril
        28
    Mithril  
       2025 年 8 月 26 日   ❤️ 1
    @magic3584 对,你得找供应商要这个 ARM 的国产系统对应的驱动和测试程序以及代码。如果他们不提供,那你根本做不了,不是说有测试程序或者驱动的代码重新编译就可以的。

    国产系统大部分都是魔改 Linux ,所以你至少要找个 Linux 驱动才能开始你这活。厂家只提供 Windows 驱动的话,你这活没法做的。

    Windows 和 Linux 的驱动模型不一样,你没法直接拿 Windows 驱动的代码编译一下就跑在 Linux 上。非常简单的通用设备可能还好点,找个通用的开源驱动改改就行了,但涉及到厂家定制的就没办法了,比如加密狗这种。

    你用不惯国产系统开发,可以找个 ARM Linux ,然后找你那国产系统测试。最后即使跑不起来,修改量也不会很大,就是 Debug 级别,改改就行。但你找个 ARM Windows 的话,驱动接口测试程序啥的都不一样,改起来就太麻烦了。
    sujin190
        29
    sujin190  
       2025 年 8 月 26 日
    国产化系统基本上内核、标准库、编译器都很老了,这些货一个一个都完全没计划考虑定期升级个内核什么的,真是坑死个人的
    nivalxer
        30
    nivalxer  
       2025 年 8 月 26 日   ❤️ 1
    最佳做法是迁移到.net core 。如果没有用到几个在.net core 中被废弃或者 windows 专有的一些功能
    例如 wcf 不再支持(有第三方库可以支持)、system.drawing 命名空间下的图形处理相关的(有三方库可以支持)
    因为提到的 web 程序,不涉及界面的话,整体迁移成本不大,是 mvc 的还是 mvc ,是 webapi 的还是 webapi 。
    然后就可以一次编辑,全平台运行了。
    irisdev
        31
    irisdev  
       2025 年 8 月 26 日
    @magic3584 #17 迁到 linux+对接硬件?那很麻烦了,这么老的项目供应商都不一定还活着,还活着的大概率是没有适配麒麟的。界面倒是问题不大,反正你前端是 web 端。
    tangmanger
        32
    tangmanger  
       2025 年 8 月 26 日   ❤️ 1
    直接升级 到.net 8 就行 前段刚试了 银河麒麟 国产 arm64 windows 下编译好 拷贝过去 启动
    rrubick
        33
    rrubick  
    OP
       2025 年 8 月 26 日
    @irisdev #31
    如果是第三方不支持的话,那就不是我们的锅了。😂
    nivalxer
        34
    nivalxer  
       2025 年 8 月 26 日   ❤️ 1
    才看到提到了有硬件的 DLL 调用的话,那个是不行的,硬件驱动库 dll 除非对方提供其他操作系统下编译的产物,否则是调用不了的。
    我们某些项目也存在类似情况,这种虽然用了.NET ,但是依然只能设置为在 windows 上运行。
    Yjhenan
        35
    Yjhenan  
       2025 年 8 月 26 日
    @magic3584 #9 .NET Framework 只支持 Windows ,支持 arm 也是 arm 架构的 Windows
    rrubick
        36
    rrubick  
    OP
       2025 年 8 月 26 日
    @Yjhenan #35
    还好我又重新问了 GPT 。
    没办法,对这是一点都不懂,所以即使问了 GPT 也只针对我的提问来回答。
    ZeoKarl
        37
    ZeoKarl  
       2025 年 8 月 26 日
    那我歪个楼,人和代码只要有一个能跑就行
    ConfusedBiscuit
        38
    ConfusedBiscuit  
       2025 年 8 月 26 日   ❤️ 1
    当我看到了“有硬件交互”这几个字,我就知道,坏了,这不简单。
    rogerhesong
        39
    rogerhesong  
       2025 年 8 月 26 日   ❤️ 1
    我使用过 jexus 把.NET Framework4.5 的 web 项目迁移到 Linux 平台,目前运行还行,改动也不多
    chenxiansheng
        40
    chenxiansheng  
       2025 年 8 月 26 日   ❤️ 1
    如果是是为了运行,建议你可以在 arm 系统上弄个 wine 环境,这样不用重构代码简易很多
    loveour
        41
    loveour  
       2025 年 8 月 26 日   ❤️ 1
    @magic3584 前面有人回复讲的很清楚了。.net 本身迁移不说很简单,至少也不麻烦。最简单粗暴的,直接在 VS 里切环境,然后改报错就行。但是如果你们底层调用了哪些库,那些才是能不能迁移的关键。.net 可以跨平台,但是你们调用的库不一定可以,这个是你们这边的层面没法改的。所以要先调研那个,那个可以才可以进行下一步。
    rrubick
        42
    rrubick  
    OP
       2025 年 8 月 26 日
    @chenxiansheng #40
    claude 给了我这个选项,不过我看不是很稳定的样子
    `3. Containerization with Wine (Not Recommended)
    Running Windows applications on Ubuntu using Wine - generally not suitable for production.`
    rrubick
        43
    rrubick  
    OP
       2025 年 8 月 26 日
    @loveour #41
    嗯,已经先去确认第三方硬件是否兼容麒麟系统了。
    linhua
        44
    linhua  
       2025 年 8 月 26 日   ❤️ 1
    前几个月刚用了 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 就是 依赖于目标平台,目标架构了。
    guanzhangzhang
        45
    guanzhangzhang  
       2025 年 8 月 26 日   ❤️ 1
    国产 arm 麒麟啥的是基于 yum 、apt 的 Linux 系统,你可以上 docker ,就是不知道客户接收 docker 不
    fkmc
        46
    fkmc  
       2025 年 8 月 26 日
    建议甩锅 反正底层硬件的依赖 99.99% 不支持
    fzdfengzi
        47
    fzdfengzi  
       2025 年 8 月 27 日   ❤️ 1
    @magic3584 mono 不维护了没关系,.net framework 更早就不维护了。mono 跑.net4.x 是没问题的,以前有项目用过。但是你的硬件调用那块,c++的 dll 得换成.so 文件才行。
    但是有条件的话,建议程序用.netcore 重构一下吧,更好维护。
    roundgis
        48
    roundgis  
       2025 年 8 月 27 日 via Android
    試試看用 mono 能不能運行

    不行就重寫
    rrubick
        49
    rrubick  
    OP
       2025 年 8 月 27 日 via iPhone
    @fzdfengzi #47
    对于我这种 0 经验的,重写属实难度很大,非必要不重写
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2905 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 07:59 · PVG 15:59 · LAX 23:59 · JFK 02:59
    ♥ Do have faith in what you're doing.