
1 rrubick OP 一楼请上帖中大佬 @Yjhenan @Mithril @lujiaxing @urlpha @sujin190 @nivalxer @tangmanger @rogerhesong @chenxiansheng @loveour @linhua @guanzhangzhang @fzdfengzi |
2 lpf0309 4 天前 建议放弃,如果好做的话,这么多软件也不会提供 arm 和 amd 版本了了 |
3 nivalxer 4 天前 看起来物理机是 arm ,走 qemu 模拟 x86 在跑,所以性能很低是正常的(例如在 apple 的 m 芯片上 pd 跑 x86 的镜像也是如此)。但是程序应该是能正常运行的。提示 **不是一个有效的 Win32 应用程序**可能是.net framework 安装的问题,如果完全是模拟 x86 在跑的话,应该是可以跑的。 |
4 rrubick OP @nivalxer #3 xp 最高只支持到 .net framework 4.0, exe 实际依赖的是 4.5 。 AI 解释这个报错应该是类似程序头已经标记了 4.5 版本,即使强行修改也会报其它错。 |
5 lpf0309 4 天前 你这活谁派给你的,我不知道这人是看得起你还是看不起你。你连源码都没有,还想换架构、换系统迁移,我经常用麒麟和 win ,有源码我都不敢保证能够迁移,你这还不如联系硬件厂商要 arm linux 驱动,然后再重写软件功能。你这硬件怎么交互得?你用虚拟机怎么保证这硬件能连到虚拟机的系统上。 |
6 aosailuolierwang 4 天前 我就是专门搞 XC 改造的,明确告诉你这个搞不了。 |
7 linhua 4 天前 放弃吧,如果和硬件交互的话,windows 和 linux 完全不一样,得改代码 |
8 Mithril 4 天前 Wine 是不行的,它只是转换 API 调用,不能转换架构。 虚拟机是可行的,只要找个能用的 Windows 就行了。你可以试试关了 PageFile 等。 但如果你那一堆 DLL 里面还有些 C++的,你找 XP 就不一定能运行了。 以你目前的进度看,最可能的办法就是看看怎么改进 Windows 7 的虚拟机性能。 |
9 ysc3839 4 天前 via Android 安装 Win10 ARM 呢? |
10 yinmin 4 天前 via iPhone 反编译成 c#源码,然后升级到 net core (需要调整源码),再编译成 arm64 linux 版本。 |
11 duzhuo 4 天前 和硬件交互 感觉很复杂 |
12 yinmin 4 天前 via iPhone qemu 安装 windows 10 arm64 版,win 10 arm64 版是能直接跑 x86 或 x64 的,而且是高速跑。 |
17 saleacy 4 天前 via Android openssh |
18 kekxv 4 天前 via iPhone 你确定 wine 能跑? 如果可以,试试虚拟机 Linux x86 ,而不是虚拟 Windows |
19 passive 4 天前 via Android 弄台国产 via 装 Windows 把硬件驱动代理成 API 在 arm 机器上调用。 |
23 liyafe1997 4 天前 目前来看,性能&兼容性最最最好的方案应该就是 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 开箱即用 |
24 liyafe1997 4 天前 |
25 liyafe1997 4 天前 噢对,也许还有一个方案,装 Win11 on ARM64 虚拟机,然后里面是能跑 x86 exe 的。 |
26 liyafe1997 4 天前 @rrubick dll 不是驱动,或者说是用户态驱动,x86 dll 在 Win on ARM 下不是问题。 sys 才是真正的内核态驱动,就看你的硬件有没有内核态驱动需求了。你的硬件是怎么连接的? USB ?串口?出现在设备管理器里面是什么东西? 如果是 USB ,可能直接走的 USB HID ,或者 USB 转串口,那这种基本都不是问题,甚至 libusb/winusb 也不是问题。但是如果是专有.sys 内核态驱动就不行了。 不过这种不常见,一般而言,要么走 HID/libusb/winusb ,要么是个 USB 串口。 |
27 kekxv 4 天前 @rrubick 你先试试能不能再 Linux x86 下跑,可以的话,就用虚拟机跑 Linux x86 测试。 如果还是不行,有个邪门的方法: - 你只是要和硬件交互,也就是不需要 UI 对吧? - 那么你可以看看 c# 怎么作为一个 http 服务器提供 api 接口 - 另外,c#的 exe 可以作为库引入 vs 开发进行调用 - 然后你改完之后,可以再试试你的 windows 虚拟机 ps:既然你用虚拟机,其实可以在你自己电脑开虚拟机测试好了再去折腾你的 arm |
28 rrubick OP |
31 Lockroach 3 天前 最简单的方案是直接基于新架构重构了 |
32 guanzhangzhang 3 天前 |
34 Calidum 3 天前 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 架构也有用类似方案。 |
37 cowcomic 3 天前 感觉不行,同时跨 CPU 架构+OS ,除非像苹果那样出一个指令级别的转译功能 不过还是插个眼,要是搞定了,来学习学习 |
38 nivalxer 3 天前 @rrubick virtio 还有 guest tools 装不上是正常的。是 arm 物理机,通过 qemu 安装的 x86 系统,是模拟 x86 在跑,这个模式性能低,兼容性也差。可以试试 windows 10/windows 11 arm64 版本,试试直接虚拟机安装。windows 11 的 arm 兼容性更好一些,对于 x86 程序,包括 C++程序支持模拟运行,除了一些特定的系统驱动没办法运行,大部分都是可以跑的。 |
39 datou 3 天前 一眼上位机程序,联系设备厂商问问 |
40 zhangeric 3 天前 .net 的程序,可以用 ilspy 等工具看到源码的,花钱找人破译,再升级到.net core 框架,走跨平台的路子.注意啊,这样做成功的概率不到一半,我是建议重新找人开发个新软件. |
41 i8086 3 天前 看了原帖内容,这部分不叫迁移,需要重写。 架构都不一样,兼容做法是还是需要 windows 机器,并不是无脑全部 arm ,找领导沟通吧。 既然人家技术回复不支持,就不要折腾,坑肯定是一大堆的。 |
42 doosit 3 天前 试试铠大师,希望可以帮到你 |
43 RobinHuuu 3 天前 via Android 不是,到底要调用什么硬件,各种虚拟方案能访问到硬件吗? |
44 devtk 3 天前 看上去是个大活,连源码都没有,难 |
45 ltyj2003 3 天前 via Android 就说干不了,勉强跑其他也是一堆未知问题,申请经费买套新的。 |
46 HojiOShi 3 天前 这种活你不条件反射般地当场拒绝,资历还是太浅了。我同事自己的源码,和硬件交互不深的,适配这些系统都花了大半年时间。没源码是怎么敢包揽这种活的? |
47 jasm 3 天前 尝试过 wine+box 的方案,折腾好几天也仅仅只是勉强跑起来,实际使用后面一堆坑,动不动崩溃 |
48 mikewang 2 天前 当然是利用 kvm 先跑一个 Windows on Arm 的虚拟机,就能直接运行 Win32 程序了。这利用的是 Windows 自带的 x86 转译功能(十分高效,类似于 Rosetta 2 )。 下面的 repo 甚至可以在树莓派的 Arm64 上跑 Win32 程序: https://github.com/Botspot/bvm |
49 tangmanger 2 天前 付费 帮你改成.net6+的 |
50 tangmanger 2 天前 @tangmanger dnspy+ilspy |
51 dog82 1 天前 信创买了麒麟 V10 ,非常让人抓狂吐血 |
52 ruanimal 1 天前 如果有硬件驱动相关的需求,各种虚拟化的方式估计都不太好使 |
53 rrubick OP |
55 ktblack 1 天前 via Android box86 可以尝试源码安装,用 docker 可以允许你无数次次失败回滚尝试,我构建了 box86+box64+wine32+wine64 的镜像,但是还是会有问题,像战地 2 加载地图就报错内存溢出 |
56 ktblack 1 天前 via Android 尝试了红警 2 、cs1.6 几乎完美运行,同花顺、百度网盘非常卡顿但勉强能用 |
57 ktblack 1 天前 via Android 感兴趣可以试一下,Dockerfile 和 wine.sh 启动脚本放在这里了: https://www.myqnapcloud.cn/smartshare/70110h14k625p40u46t68840_62895h7k82p82q6612svv83286699d7j |
58 wheat0r 1 天前 正确方法是报一个国产化适配的项目,要一笔预算,做一套新的 |
59 sn0wdr1am 1 天前 放过自己 |
60 kero991 1 天前 via Android 是这样,x86 虚拟机能不能装,能,但 qemu 官方给的跨架构性能损失在几十倍到百倍以上,也就是说,正常开机 1 分钟,你用 qemu 要开机 100 分钟。这玩意真的就是开机 2 小时,装系统用 1 天的速度。 推荐当然是 box86/exgear+wine ,这玩意就是响应速度不佳且经常卡死,兼容性也远不如 x86Linux 直接 wine ,但好歹勉强能用。唯一的问题是,wine 不能调用驱动的,你得确定你得硬件有 arm64 Linux 的驱动,而不是说有个 win 驱动,那玩意驱动不了。 最后,我不确定你用的芯片,arm64 的几个芯片里,飞腾兼容性最好,基本就是公版 arm64 ,麒麟 9000 比较坑,他用 OpenGL ES+wayland 这种几乎没人用的组合,极难适配。最差的选择是鲲鹏,这玩意阉割了 32 位指令集,所以完全不可能使用任何 32 位应用。 |
61 kero991 1 天前 via Android 所以我建议你先确定客户端的芯片,虽然架构都是 arm64 ,但各家(主要是华为这个坑 b )做了很多魔改。另外,飞腾官方有一个虚拟机软件,相当于 qemu+libvirt 的整合,并且有比较简易的前端。如果你自己编译或者安装的 qemu ,装 win11 arm 要把显示驱动切换为 ramfb (高版本才有) 总而言之,wine 方案是最优选,arm win11 是次选,装 x86 win 基本不可用。 当然,最重要的是,这所有的方案你都无法保证能够调用驱动。wine 本身就不支持驱动(为什么国产网游都不能用 wine 玩,因为他们的反作弊都是驱动级的,wine 不支持),而虚拟机,你只有把硬件直通进虚拟机才有可能调用驱动,而别忘了,即使你虚拟了 arm win11 ,你驱动可是 x32 的,arm win 可以运行 x32 exe ,但可安装不了 x32 的驱动哦 |
62 kero991 1 天前 via Android 所以我觉得,你最终最好的结果就是不管什么方法,exe 界面跑起来了,但硬件完全连接不上,没有驱动,无法驱动。 |