簡體   English   中英

了解.Net中的32位與64位

[英]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執行的機器指令。


“中斷”目標文件的32bit64bit之間的差異是: 指針大小內存模型 ,最重要的是指令集架構(ISA) 讓我們分解每一點,看看為什么.Net組件大多不受影響。

點大小(或長度)

32bit執行環境中,指針長度為32位,正如您所希望的那樣,它們是64位長。 這個事實可以通過以下兩種方式之一破壞你的裝配:

  1. 包含指針的結構將具有內部存儲器結構更改,因為它們需要更多(或更少)字節來存儲指針。
  2. 指針算術 - 一些聰明的開發人員喜歡玩指針,屏蔽它們,添加它們等等。 在某些情況下,指針的大小可以是這些計算的積分,以產生正確的結果。

為什么.Net程序集不受影響

由於.Net語言是safe - 你不能使用指針(通常,除非你處於不安全的環境下)。 沒有選擇使用指針解決了第二點。 至於第一點 - 這就是你可以獲得類的大小(使用sizeof )而不是包含類引用的struct的大小的原因。

記憶模型

舊的32bit處理器曾經有一個稱為Memory segmentation的功能,允許OSSupervisor program聲明使用稱為Segment registers特殊CPU registers訪問的內存區域。 64bit此功能大多被禁用。 因此,在內存分段下編譯的程序可能在非分段環境中工作時會出現問題。

為什么.Net程序集不受影響

通常我們不處理這個低級別的內存,這是可能的,因為.Net virtual machine將在下一點解釋。

指令集架構

32bit64bitx86AMD64 )是相似但完全不同的ISAs ,這意味着組裝在一個下運行的代碼不會在另一個下運行。 所以與其他兩點不同的是,不管你寫的是什么,這個都會破壞你的裝配。

為什么.Net程序集不受影響

那么.Net程序集怎么可能被編譯為Any CPU 訣竅在於,當您編譯.Net語言時,您從未組裝它。 這意味着當您按下compile您只需將代碼編譯為未組裝的中間對象(稱為.Net程序集)(即,不通過匯編程序運行)。

通常,當您使用C/++編譯代碼時,首先通過編譯運行它,然后生成一些assembly instructions指令,然后將這些指令傳遞給生成machine instructionsassembler 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM