Dot-Net

為什麼.net 程序集因不同的架構而不同?

  • August 31, 2010

我可以為 x86 和 x64 建構我的 C# 項目。為什麼?我認為它會生成一個根本不是特定於平台的特殊程式碼。

首先,坦率地說,我不知道這裡的整個故事,我會用我認為我知道的來回答。如果有人能告訴我我錯在哪裡,我會很樂意刪除或更改我的答案。

按照我的理解,這個設置是一個標誌,上面寫著“程序集應該在這種類型的體系結構中執行”。這是針對 x86 和 x64 設置的。MSIL/.NET 設置只是說“我不在乎,我可以在任何一個上執行,所以選擇一個最佳或可用的”。

例如,您可能正在通過 P/Invoke 呼叫 Win32 API 函式,在這種情況下,程序集將無法在 x64 上執行,您應該將其標記為 x86。

因此,如果我的理解是正確的,以下是三個標誌如何使程序集在不同平台上執行(注意,它是主程序集,程序程序集,它決定了這一點,而不是每個單獨的程序集):

Setting        x86      x64  <-- Platform (CPU/OS)
MSIL/.NET     32-bit   64-bit
x86           32-bit   32-bit
x64           N/A (*)  64-bit

x86 上 x64 程序集的 N/A 意味著程序集不會載入,如果您嘗試,您將得到異常。

另請注意,涉及 x86 和 x64 的衝突設置會使您的程序在某一時刻崩潰。如果主程序集設置為 x86,它將在 32 位和 64 位作業系統上作為 32 位程序執行,並且任何載入標記為 x64 的程序集的嘗試都將失敗。同樣,如果主程序集設置為 x64,它將僅在 64 位作業系統上執行,並且任何將程序集設置為 x86 的嘗試都將失敗。

MSIL 主可執行程序集將在 32 位作業系統上以 32 位執行(如設置為 x86,具有上述故障點),在 64 位作業系統上以 64 位執行(如設置為 x64,具有上述故障點。)

顯然,通常情況下,如果您不呼叫標記為特定內容的程序集,並且只要您不執行不能跨 32 位和 64 位移植的 P/Invoke,則您希望使用 MSIL 設置(我不知道這是否有效,如果 P/Invoke 到 win-api 函式將映射到正確的位大小的 dll 或不。)

由於引用是指針,並且指針在兩個平台上儲存為本機 x 位地址,根據您擁有的引用數量,您可能有理由反對僅使用 MSIL。但是,您應該在更改設置之前確認這是一個問題。

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