32位和64位.NET(4)應用程序有什麼區別?32位和64位.NET(4)應用程序之間的差異
通常,32位應用程序在64位計算機上運行時遇到問題,反之亦然。我知道我可以聲明一個整數作爲int32和int64(當然32位系統上的int64會造成問題)。編程32位或64位或32位和64位兼容應用程序之間是否存在其他差異?
32位和64位.NET(4)應用程序有什麼區別?32位和64位.NET(4)應用程序之間的差異
通常,32位應用程序在64位計算機上運行時遇到問題,反之亦然。我知道我可以聲明一個整數作爲int32和int64(當然32位系統上的int64會造成問題)。編程32位或64位或32位和64位兼容應用程序之間是否存在其他差異?
一些差異:
32位和64位應用程序只能加載相同位數的的DLL。如果您的平臺目標是「任何CPU」,並且您引用或32位本機DLL,則這對於託管項目可能是個問題。當您的「任何CPU」程序在64位計算機上運行時,會出現問題,因爲您的應用程序以64位進程運行。當它試圖加載32位本地DLL依賴項時,它將引發異常(BadImageFormatException
)並可能崩潰。
還有文件系統和註冊表問題。嘗試從C:\Program Files
中讀取的WOW64進程最終將被重定向到C:\Program Files (x86)
,除非它首先禁用Windows文件系統重定向(請參閱Wow64DisableWow64FsRedirection
)。對於Windows 7之前的Windows版本,還存在與上述文件系統重定向問題類似的註冊表反射問題。 MSDN文章Registry Reflection解釋得很好。
特定於平臺的類型如IntPtr
將具有不同的大小。這可能是假定固定大小的代碼中的問題(序列化,編組)。
對於GAC中的32位和64位文件,有單獨的物理目錄。對於我的系統,他們在C:\Windows\Microsoft.NET\assembly\GAC_32
和C:\Windows\Microsoft.NET\assembly\GAC_64
。
32位和64位應用程序的虛擬地址空間大小不同。對於32位應用程序,大小爲2 GB(默認值)或3 GB(啓用4GT)。對於64位應用程序,大小爲8 TB。 32位地址空間可能是超大型應用程序的限制。
稍微隱晦一點,但很多進程間的調用在32位和64位進程之間不起作用。例如,嘗試在64位進程上調用ReadProcessMemory
時,32位進程可能會失敗。 WriteProcessMemory
,EnumProcessModules
和許多類似的方法也是如此。如果您嘗試使用System.Diagnostics.Process.Modules
API從32位應用程序中枚舉64位應用程序的模塊,則可以在C#應用程序中看到這一點。
很好的答案!問:「IntPtr」不是僅*安全平臺相關類型嗎? – stakx 2012-06-23 17:37:57
一般來說,我認爲你不應該有託管代碼的任何問題。
潛在問題可能來自非託管代碼。例如,因爲在32位和64位系統中可變大小不同,所以指針是不同的,例如,C/C++中int變量的大小取決於系統。至於已經提到的託管代碼,WoW可以處理。
x64當使用x86託管代碼時,託管代碼將使用Streaming SIMD Extensions (SSE)進行雙/浮點計算,而不是x87 Floating Point Unit (FPU)。
這可能有幫助 - http://stackoverflow.com/questions/3102765/net-3-5-web-application-porting-to-64bit-potential-issues – InSane 2010-08-22 08:24:33
可能重複的[64位東西的C#開發] (http://stackoverflow.com/questions/1889941/64-bits-stuff-for-development) – 2010-08-22 08:52:41