所謂動態載入,就是運行時,使用到 kernel32.dll 中的 LoadLibrary() 去載入 32 位的 DLL。
問題來了,在64位 WIN 環境下,Windows\System32\Kernel32.dll 是 64位 的!!!!真正的 32位 kernel32.dll 在 Windows\SysWOW64\ 下,按原來 Windows 的思路,Windows\System 放的是16位 DLL,System32放的是32位DLL,那么64位系統DLL,就應該放到 System64下啊!!!你說這些阿三干的是啥?所以,就會發生 64位 C# 程序使用 Windows\System32\kernel32.dll 中的 LoadLibrary() 時,載入不了 32位 DLL 的情況。
解決方法:
首先,最簡單的方法,就是犧牲 C# 64位的特點,把工程輸出 從 AnyCPU 改為 x86。這樣就是一路32位了(其實就變成 32位 C#程序 動態調用 32位 C++ DLL了)。
其次,有人提出一個方法就是 做一個 ATL COM 的封裝服務EXE,用那個去 載入 32位的DLL,待嘗試。