【Visual Studio】程式編譯:Any CPU, x86, x64 的差別

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)