[英]Understanding 32-bit vs 64-bit in .Net
我總是繞過構建64位桌面應用程序的問題,因為我在某種程度上認為這不是一件容易的事情,而且我想我並不是真的理解解決方案“配置管理器”對話框,平台和配置。
無論如何,我只是嘗試通過簡單地將所有解決方案項目的平台更改為x64來轉換現有應用程序,並且它有效。 我遇到的唯一問題是其中一個項目引用的C ++ DLL,需要重建為x64。
所以我的問題(最后)是:為什么我只有C ++ DLL的問題,但我的解決方案中的項目引用的許多.Net程序集DLL都沒問題?
究竟是什么決定了我的應用程序是否構建為64位? 我將所有解決方案的項目更改為“x64”,但如果將它們保留為“任何CPU”,它是否仍然有用,我只將WPF(啟動)項目更改為“x64”?
編輯
所以最后我似乎只能將所有項目平台設置為“任何CPU”而不是“x64”(TFS服務器無法使用后者運行單元測試)。 甚至引用非托管64位DLL的項目也很滿意(不確定原因)。
訣竅是取消選中WPF(啟動)項目屬性中的Prefer 32-bit
選項。 構建的應用程序現在作為64位應用程序運行,並且TFS /單元測試運行愉快。
從正確性的角度來看,32/64僅在您與本機代碼進行互操作,使用低級不安全功能或分配大量(> 4GB)內存時才有意義。 如果不考慮這些因素,您可以使用AnyCpu。 AnyCpu代碼將默認為您的主機操作系統位數(盡管可以更改默認值),因此對於大多數人來說,它最終將以64位進程運行。
有時性能原因顯然需要32或64位。 32位應用程序通常會更加緩存友好。 計算綁定應用程序在以64位進程運行時應該表現更好(盡管並非總是如此)。
TL; DR :.Net程序集從不匯編到機器特定指令中,而是編譯成在.Net虛擬機下運行的MSIL,在運行時,VM使用JITer生成可由CPU執行的機器指令。
“中斷”目標文件的32bit
和64bit
之間的差異是: 指針大小 , 內存模型 ,最重要的是指令集架構(ISA) 。 讓我們分解每一點,看看為什么.Net
組件大多不受影響。
在32bit
執行環境中,指針長度為32位,正如您所希望的那樣,它們是64位長。 這個事實可以通過以下兩種方式之一破壞你的裝配:
由於.Net語言是safe
- 你不能使用指針(通常,除非你處於不安全的環境下)。 沒有選擇使用指針解決了第二點。 至於第一點 - 這就是你可以獲得類的大小(使用sizeof
)而不是包含類引用的struct的大小的原因。
舊的32bit
處理器曾經有一個稱為Memory segmentation
的功能,允許OS
或Supervisor program
聲明使用稱為Segment registers
特殊CPU registers
訪問的內存區域。 在64bit
此功能大多被禁用。 因此,在內存分段下編譯的程序可能在非分段環境中工作時會出現問題。
通常我們不處理這個低級別的內存,這是可能的,因為.Net virtual machine
將在下一點解釋。
32bit
和64bit
( x86
和AMD64
)是相似但完全不同的ISAs
,這意味着組裝在一個下運行的代碼不會在另一個下運行。 所以與其他兩點不同的是,不管你寫的是什么,這個都會破壞你的裝配。
那么.Net程序集怎么可能被編譯為Any CPU
? 訣竅在於,當您編譯.Net語言時,您從未組裝它。 這意味着當您按下compile
您只需將代碼編譯為未組裝的中間對象(稱為.Net程序集)(即,不通過匯編程序運行)。
通常,當您使用C/++
編譯代碼時,首先通過編譯運行它,然后生成一些assembly instructions
指令,然后將這些指令傳遞給生成machine instructions
的assembler
。 CPU只能執行這些machine instructions
。
.Net語言是不同的,如上所述,當您編譯.Net語言時,您通過編譯器運行它並停在那里,不涉及匯編程序。 這里的編譯也生成一些assembler instructions
但與c/c++
編譯生成的assembler instructions
不同,這些指令與機器無關,它們是用MSIL - Microsoft intermediate language
編寫的。 沒有CPU知道如何執行這些指令,因為就像普通的匯編程序指令一樣,它們也必須組裝成機器指令。
訣竅是這一切都發生在運行時,當用戶打開程序時,他啟動了程序運行的.Net runtime
的實例,程序永遠不會直接針對本機計算機本身運行。 當你的程序需要在.Net虛擬機中調用一個名為JITer - just in time compiler
的特殊組件的方法時JITer - just in time compiler
的任務是將這個方法從MSIL組裝到特定於機器的機器指令上安裝.Net框架。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.