Dot-Net

我可以在 Windows 上將 32 位 DLL 載入到 64 位程序中嗎?

  • October 22, 2008

我最近升級了 ac# windows 服務以作為 64 位 .net 程序執行。通常,這很簡單,但係統使用了一個用 C++ 編寫的 32 位 DLL。將此 DLL 轉換為 64 位不是一個選項,因此我將 DLL 包裝在一個單獨的 32 位 .net 程序中,並通過遠端處理公開了一個 .net 介面。

這是一個非常可靠的解決方案,但我更願意將系統作為單個程序執行。有什麼辦法可以將我的 32 位 DLL 載入到 64 位程序中並直接訪問它(也許通過某種 thunking 層)?

不,你不能。

16 位和 32 位 Windows 都存在於 32 位線性地址空間中。術語 16 和 32 指的是相對於選擇器的偏移量大小。

首先,請注意全尺寸的 16 位指針和 32 位平面指針的大小相同。值 0x0123:0x467 需要 32 位,哇,32 位指針也是如此。這意味著包含指針的資料結構不會在 16 位和 32 位對應物之間改變大小。一個非常方便的巧合。

這兩個觀察結果都不適用於 32 位到 64 位的轉換。指針的大小發生了變化,這意味著將 32 位結構轉換為 64 位結構(反之亦然)會改變結構的大小。並且 64 位地址空間是 32 位地址空間的 40 億倍。如果 64 位地址空間中偏移量 0x000006fb`01234567 處有一些記憶體,則 32 位程式碼將無法訪問它。並不是說你可以建立一個臨時地址視窗,因為 32 位平面程式碼不知道這些臨時地址視窗;他們放棄了選擇器,記得嗎?

<http://blogs.msdn.com/oldnewthing/archive/2008/10/20/9006720.aspx>

引用自:https://stackoverflow.com/questions/225151