20 年前的32-bit 程式放到64-bit 的Windows Server 2019 之后,无法执行。所以来研究编译时的设定有什么影响。
20 年前的旧程式因为调整,所以使用Visual Studio 2019 修改之后重新编译执行档。后来同仁发现在2019 上没办法执行,于是他下了cmd 指令:C:\Windows\Microsoft.NET\Framework64\v2.0.50727\ldr64.exe SetWow
让程式可以跑起来。但是后续其他厂商发现因为下了这个指令,导致他们的程式跑不起来。经研究这样的调整其实不太正规,必须要研究其原理并找出适当的解法。以下从作业系统64bit, 32bit 在资源上的取得,再延伸到程式编译的差别。
资源取得
基本上32-bit 跟64-bit 的资源不互通,意即32-bit 的程式不能引用64-bit 编译的dll,反之亦然。
32-bit 的.NET 函式库在:C:\Windows\Microsoft.NET\Framework\v0.0.00000
64-bit 的.NET 函式库在:C:\Windows\Microsoft.NET\Framework64\v0.0.00000
另外一个有趣的是:System32 存放64-bit 的dll,SysWOW64 存放32-bit 的dll。故在64-bit 的系统上运行32-bit 程式,此时dll 引用目录会定位到SysWOW64。
编译目标
分为四种
种类 | 说明 | 在32-bit 系统 | 在64-bit 系统 |
Any CPU | 会依照执行环境的位元种类决定要跑在哪一个位元上 | 32 | 64 |
Any CPU Prefer 32-bit (预设) | 会依照执行环境的位元种类决定要跑在哪一个位元上 但会优先跑32-bit | 32 | 32 |
x86 | 跑32-bit | 32 | 32 |
x64 | 跑64-bit | ERROR | 64 |
故本次的问题是编译程式时使用了Any CPU且环境为64-bit 系统,而该程式在运行64-bit 的状况下参考到32-bit 编译的dll 档,因不相容而造成程式无法运作。
Reference:
将程式编译成 x86、x64、Any CPU差别在哪 | 程式随笔 (toyo0103.github.io)
Windows 64位系统下,x64和x86以及System32目录和SysWOW64目录的区别 - 回形针的迷宫 - 博客园 (cnblogs.com)