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会依照执行环境的位元种类决定要跑在哪一个位元上3264
Any CPU Prefer 32-bit (预设)会依照执行环境的位元种类决定要跑在哪一个位元上
但会优先跑32-bit
3232
x86跑32-bit3232
x64跑64-bitERROR64

故本次的问题是编译程式时使用了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)