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)