V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
rrubick
V2EX  ›  Linux

[求救]怎么在 arm64 的麒麟 v10 上运行 win32 的 exe

  •  
  •   rrubick · 2 天前 · 2025 次点击
    前情提要 https://www.v2ex.com/t/1154926#reply49

    目前已知项目情况:
    1. 没有源码,只有一个文件夹,因为要和硬件交互,内部含有大量 dll ,靠运行一个 32 位的 exe 来启动
    2. 基于 .net framework 4.5

    已做尝试:

    1. 虚拟机方案 qemu + virt-manager

    1.1 安装 xp ,并安装 .net framework 4.0, 运行 exe 提示 **不是一个有效的 Win32 应用程序**

    1.2 安装 32 位和 64 位 win7 ,给了 4G 或者 8G 内存,卡顿严重。在 32 位上运行 exe 卡住无法打开。AI 说要安装 virtio 驱动,但是即使是管理员身份依然提示没有权限

    2. Wine/Wine64 + Box86/Box64

    只成功安装了 Box64 ,Box86 安装失败。使用 Box64 无法运行 32 位 exe

    3. 求助麒麟技术支持

    多位支持说 x86 的虚拟机是装不上的,而事实上我已成功安装


    不知道大佬们还是否有别的解决方案
    50 条回复    2025-11-23 11:44:48 +08:00
    lpf0309
        2
    lpf0309  
       2 天前
    建议放弃,如果好做的话,这么多软件也不会提供 arm 和 amd 版本了了
    nivalxer
        3
    nivalxer  
       2 天前
    看起来物理机是 arm ,走 qemu 模拟 x86 在跑,所以性能很低是正常的(例如在 apple 的 m 芯片上 pd 跑 x86 的镜像也是如此)。但是程序应该是能正常运行的。提示 **不是一个有效的 Win32 应用程序**可能是.net framework 安装的问题,如果完全是模拟 x86 在跑的话,应该是可以跑的。
    rrubick
        4
    rrubick  
    OP
       2 天前
    @nivalxer #3
    xp 最高只支持到 .net framework 4.0, exe 实际依赖的是 4.5 。
    AI 解释这个报错应该是类似程序头已经标记了 4.5 版本,即使强行修改也会报其它错。
    lpf0309
        5
    lpf0309  
       2 天前
    你这活谁派给你的,我不知道这人是看得起你还是看不起你。你连源码都没有,还想换架构、换系统迁移,我经常用麒麟和 win ,有源码我都不敢保证能够迁移,你这还不如联系硬件厂商要 arm linux 驱动,然后再重写软件功能。你这硬件怎么交互得?你用虚拟机怎么保证这硬件能连到虚拟机的系统上。
    aosailuolierwang
        6
    aosailuolierwang  
       2 天前
    我就是专门搞 XC 改造的,明确告诉你这个搞不了。
    linhua
        7
    linhua  
       2 天前
    放弃吧,如果和硬件交互的话,windows 和 linux 完全不一样,得改代码
    Mithril
        8
    Mithril  
       2 天前
    Wine 是不行的,它只是转换 API 调用,不能转换架构。

    虚拟机是可行的,只要找个能用的 Windows 就行了。你可以试试关了 PageFile 等。

    但如果你那一堆 DLL 里面还有些 C++的,你找 XP 就不一定能运行了。

    以你目前的进度看,最可能的办法就是看看怎么改进 Windows 7 的虚拟机性能。
    ysc3839
        9
    ysc3839  
       2 天前 via Android
    安装 Win10 ARM 呢?
    yinmin
        10
    yinmin  
       2 天前 via iPhone
    反编译成 c#源码,然后升级到 net core (需要调整源码),再编译成 arm64 linux 版本。
    duzhuo
        11
    duzhuo  
       2 天前
    和硬件交互 感觉很复杂
    yinmin
        12
    yinmin  
       2 天前 via iPhone
    qemu 安装 windows 10 arm64 版,win 10 arm64 版是能直接跑 x86 或 x64 的,而且是高速跑。
    rrubick
        13
    rrubick  
    OP
       2 天前
    @lpf0309 #5
    现在只是第一步想先跑起来,准备后面再说虚拟机怎么连外部网络。
    有的厂商都停产了,没驱动
    rrubick
        14
    rrubick  
    OP
       2 天前
    @Mithril #8
    目前 AI 都是给出安装 virtio 还有 guest tools 啥的,但是装不上。。。
    rrubick
        15
    rrubick  
    OP
       2 天前
    @ysc3839 #9
    @yinmin #12
    arm64 能跑 x86 这我倒是不知道,我试试。关键是不知道驱动能不能适用
    ysc3839
        16
    ysc3839  
       2 天前 via Android
    @rrubick 要装什么驱动?
    saleacy
        17
    saleacy  
       2 天前 via Android
    openssh
    kekxv
        18
    kekxv  
       2 天前 via iPhone
    你确定 wine 能跑?
    如果可以,试试虚拟机 Linux x86 ,而不是虚拟 Windows
    passive
        19
    passive  
       2 天前 via Android
    弄台国产 via 装 Windows 把硬件驱动代理成 API 在 arm 机器上调用。
    rrubick
        20
    rrubick  
    OP
       2 天前
    @ysc3839 #16
    里面一大堆,涉及到硬件的
    rrubick
        21
    rrubick  
    OP
       2 天前
    @kekxv #18
    主要是有很多 dll 驱动,在 arm 上跑不了
    ysc3839
        22
    ysc3839  
       2 天前 via Android
    @rrubick 如果是涉及内核驱动,那就不能用 ARM 系统了
    liyafe1997
        23
    liyafe1997  
       2 天前
    目前来看,性能&兼容性最最最好的方案应该就是 Box86 了,但是 Box86 只能 ARM32 ,这是最头疼的点。但凡你的 exe 是 x64 的,能跑 Box64 on ARM64 ,都方便得多。

    我之前这么在 RK3566 ( 4 核 A53 )上跑过 x64 exe ,就是典型的 Qt 工业 GUI 应用,性能完全是非常可用的程度。

    如果你目前的 ARM64 的 Linux 不好装上 ARM32 支持库/坑太多的话,也许可以试试一些 Box86 Docker ?
    https://github.com/DerpyChap/box86-docker
    看起来这个能在 ARM64 上 Box86 开箱即用
    liyafe1997
        24
    liyafe1997  
       2 天前   ❤️ 1
    补充:
    https://github.com/alzhahirdev/winebox86
    搜到这个看起来更好,连 Wine 都给你打包进去了
    liyafe1997
        25
    liyafe1997  
       2 天前
    噢对,也许还有一个方案,装 Win11 on ARM64 虚拟机,然后里面是能跑 x86 exe 的。
    liyafe1997
        26
    liyafe1997  
       2 天前   ❤️ 1
    @rrubick dll 不是驱动,或者说是用户态驱动,x86 dll 在 Win on ARM 下不是问题。
    sys 才是真正的内核态驱动,就看你的硬件有没有内核态驱动需求了。你的硬件是怎么连接的? USB ?串口?出现在设备管理器里面是什么东西?

    如果是 USB ,可能直接走的 USB HID ,或者 USB 转串口,那这种基本都不是问题,甚至 libusb/winusb 也不是问题。但是如果是专有.sys 内核态驱动就不行了。
    不过这种不常见,一般而言,要么走 HID/libusb/winusb ,要么是个 USB 串口。
    kekxv
        27
    kekxv  
       2 天前
    @rrubick 你先试试能不能再 Linux x86 下跑,可以的话,就用虚拟机跑 Linux x86 测试。

    如果还是不行,有个邪门的方法:
    - 你只是要和硬件交互,也就是不需要 UI 对吧?
    - 那么你可以看看 c# 怎么作为一个 http 服务器提供 api 接口
    - 另外,c#的 exe 可以作为库引入 vs 开发进行调用
    - 然后你改完之后,可以再试试你的 windows 虚拟机

    ps:既然你用虚拟机,其实可以在你自己电脑开虚拟机测试好了再去折腾你的 arm
    rrubick
        28
    rrubick  
    OP
       2 天前
    @ysc3839 #22
    @liyafe1997 #23
    我不清楚是不是内核驱动,里面包含打印机和读卡器啥的一类的。
    准备先装个 arm64 的 win10 试试
    rrubick
        29
    rrubick  
    OP
       2 天前
    @kekxv #27
    一点源码没有,只有打包好的程序,没法借鉴。
    kekxv
        30
    kekxv  
       2 天前
    @rrubick 不需要借鉴,c#打出来的 exe 可以当作 c#的 dll 直接引入调用
    Lockroach
        31
    Lockroach  
       2 天前
    最简单的方案是直接基于新架构重构了
    guanzhangzhang
        32
    guanzhangzhang  
       2 天前
    如果有过好几门编程语言经验,并且在非 crud 方面有过独立开发,可以试试学下 c#去搓一个替代品
    kokutou
        33
    kokutou  
       2 天前 via Android
    @rrubick
    大概率跑起来也连不了硬件的
    Calidum
        34
    Calidum  
       2 天前
    1. Wine64 9.0 开始有 WoW64 功能,有开启就能跑 32 位 x86 。安装好 Box64/Fex 运行 Wine64 就行。
    3. Box64 开启 Box32 或者 Fex 也能跑 32 位的 Wine 。性能比跑 WoW64 好。
    3. Hangover 基于 Arm64 版 Wine 性能好,ARM64EC 功能只对 x86 、x86_64 部分做转译。转译 32 位 x86 部分由 Box64/Fex 负责 (wowbox64.dll /libwow64fex.dll)。

    x86 理论上 Hangover 用 wowbox64.dll 性能最好。

    PS: 就算是龙芯和 RISC-V 架构也有用类似方案。
    winstars
        35
    winstars  
       1 天前 via Android
    @Mithril 换架构了那就不是虚拟机的事情了,而是模拟器,类似于用 pc 玩 nds 掌机的那种
    winstars
        36
    winstars  
       1 天前 via Android
    @yinmin xc 性能弱到渣,别试了,卡得你怀疑人生
    cowcomic
        37
    cowcomic  
       1 天前
    感觉不行,同时跨 CPU 架构+OS ,除非像苹果那样出一个指令级别的转译功能
    不过还是插个眼,要是搞定了,来学习学习
    nivalxer
        38
    nivalxer  
       1 天前
    @rrubick virtio 还有 guest tools 装不上是正常的。是 arm 物理机,通过 qemu 安装的 x86 系统,是模拟 x86 在跑,这个模式性能低,兼容性也差。可以试试 windows 10/windows 11 arm64 版本,试试直接虚拟机安装。windows 11 的 arm 兼容性更好一些,对于 x86 程序,包括 C++程序支持模拟运行,除了一些特定的系统驱动没办法运行,大部分都是可以跑的。
    datou
        39
    datou  
       1 天前
    一眼上位机程序,联系设备厂商问问
    zhangeric
        40
    zhangeric  
       1 天前
    .net 的程序,可以用 ilspy 等工具看到源码的,花钱找人破译,再升级到.net core 框架,走跨平台的路子.注意啊,这样做成功的概率不到一半,我是建议重新找人开发个新软件.
    i8086
        41
    i8086  
       1 天前
    看了原帖内容,这部分不叫迁移,需要重写。

    架构都不一样,兼容做法是还是需要 windows 机器,并不是无脑全部 arm ,找领导沟通吧。

    既然人家技术回复不支持,就不要折腾,坑肯定是一大堆的。
    doosit
        42
    doosit  
       1 天前
    试试铠大师,希望可以帮到你
    RobinHuuu
        43
    RobinHuuu  
       1 天前 via Android
    不是,到底要调用什么硬件,各种虚拟方案能访问到硬件吗?
    devtk
        44
    devtk  
       1 天前
    看上去是个大活,连源码都没有,难
    ltyj2003
        45
    ltyj2003  
       1 天前 via Android
    就说干不了,勉强跑其他也是一堆未知问题,申请经费买套新的。
    HojiOShi
        46
    HojiOShi  
       1 天前
    这种活你不条件反射般地当场拒绝,资历还是太浅了。我同事自己的源码,和硬件交互不深的,适配这些系统都花了大半年时间。没源码是怎么敢包揽这种活的?
    jasm
        47
    jasm  
       1 天前
    尝试过 wine+box 的方案,折腾好几天也仅仅只是勉强跑起来,实际使用后面一堆坑,动不动崩溃
    mikewang
        48
    mikewang  
       20 小时 6 分钟前
    当然是利用 kvm 先跑一个 Windows on Arm 的虚拟机,就能直接运行 Win32 程序了。这利用的是 Windows 自带的 x86 转译功能(十分高效,类似于 Rosetta 2 )。

    下面的 repo 甚至可以在树莓派的 Arm64 上跑 Win32 程序:

    https://github.com/Botspot/bvm
    tangmanger
        49
    tangmanger  
       13 小时 52 分钟前
    付费 帮你改成.net6+的
    tangmanger
        50
    tangmanger  
       12 小时 49 分钟前
    @tangmanger dnspy+ilspy
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1341 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 16:34 · PVG 00:34 · LAX 08:34 · JFK 11:34
    ♥ Do have faith in what you're doing.