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

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

  •  
  •   magic3584 · 12 天前 · 2249 次点击

    有一个老项目,是用 .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 条附言  ·  12 天前
    我麻了大佬们,升级解决不了问题!

    - .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 条附言  ·  12 天前
    抱歉误导大佬们了,我没有说清楚。

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

    感谢各位大佬!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    不行就重寫
    magic3584
        49
    magic3584  
    OP
       10 天前 via iPhone
    @fzdfengzi #47
    对于我这种 0 经验的,重写属实难度很大,非必要不重写
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2697 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 02:39 · PVG 10:39 · LAX 19:39 · JFK 22:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.