2010-08-22 248 views
10

32位和64位.NET(4)應用程序有什麼區別?32位和64位.NET(4)應用程序之間的差異

通常,32位應用程序在64位計算機上運行時遇到問題,反之亦然。我知道我可以聲明一個整數作爲int32和int64(當然32位系統上的int64會造成問題)。編程32位或64位或32位和64位兼容應用程序之間是否存在其他差異?

+3

這可能有幫助 - http://stackoverflow.com/questions/3102765/net-3-5-web-application-porting-to-64bit-potential-issues – InSane 2010-08-22 08:24:33

+1

可能重複的[64位東西的C#開發] (http://stackoverflow.com/questions/1889941/64-bits-stuff-for-development) – 2010-08-22 08:52:41

回答

28

一些差異:

  1. 32位和64位應用程序只能加載相同位數的的DLL。如果您的平臺目標是「任何CPU」,並且您引用或32位本機DLL,則這對於託管項目可能是個問題。當您的「任何CPU」程序在64位計算機上運行時,會出現問題,因爲您的應用程序以64位進程運行。當它試圖加載32位本地DLL依賴項時,它將引發異常(BadImageFormatException)並可能崩潰。

  2. 還有文件系統和註冊表問題。嘗試從C:\Program Files中讀取的WOW64進程最終將被重定向到C:\Program Files (x86),除非它首先禁用Windows文件系統重定向(請參閱Wow64DisableWow64FsRedirection)。對於Windows 7之前的Windows版本,還存在與上述文件系統重定向問題類似的註冊表反射問題。 MSDN文章Registry Reflection解釋得很好。

  3. 特定於平臺的類型如IntPtr將具有不同的大小。這可能是假定固定大小的代碼中的問題(序列化,編組)。

  4. 對於GAC中的32位和64位文件,有單獨的物理目錄。對於我的系統,他們在C:\Windows\Microsoft.NET\assembly\GAC_32C:\Windows\Microsoft.NET\assembly\GAC_64

  5. 32位和64位應用程序的虛擬地址空間大小不同。對於32位應用程序,大小爲2   GB(默認值)或3   GB(啓用4GT)。對於64位應用程序,大小爲8   TB。 32位地址空間可能是超大型應用程序的限制。

  6. 稍微隱晦一點,但很多進程間的調用在32位和64位進程之間不起作用。例如,嘗試在64位進程上調用ReadProcessMemory時,32位進程可能會失敗。 WriteProcessMemory,EnumProcessModules和許多類似的方法也是如此。如果您嘗試使用System.Diagnostics.Process.Modules API從32位應用程序中枚舉64位應用程序的模塊,則可以在C#應用程序中看到這一點。

+0

很好的答案!問:「IntPtr」不是僅*安全平臺相關類型嗎? – stakx 2012-06-23 17:37:57

3

一般來說,我認爲你不應該有託管代碼的任何問題。

潛在問題可能來自非託管代碼。例如,因爲在32位和64位系統中可變大小不同,所以指針是不同的,例如,C/C++中int變量的大小取決於系統。至於已經提到的託管代碼,WoW可以處理。

相關問題