2012-04-15 19 views
1

我知道IntPtr.Size可以檢查64位或32位。 (8 || 4字節)通過不同的環境檢查32位代碼?

問題:

IntPtr.Size關於向

  • 操作系統平臺

  • .NET編譯版(我可以編譯成32或64)

請問您可以檢查並更正此表嗎?

compiled to | running OS | IntPtr.Size 
______________________________________ 
     64    32  wont run 
     64    64   8 
     32    32   4 
     32    64   4 

回答

2

表是正確的,只要你的列「運行」指的是操作系統,而不是CPU的位數的位數。

請記住,實際上有三個選項:32,64和AnyCPU:

compiled to | running on  | IntPtr.Size 
___________________________________________ 
     64  | 32   | won't run 
     64  | 64   | 8 
     32  | 32   | 4 
     32  | 64   | 4 
     AnyCPU | 32   | 4 
     AnyCPU | 64   | 8 
+3

.Net 4.5有一個新的選項:[任何CPU 32位首選](http://blogs.microsoft.co.il/blogs/sasha/archive/2012/04/04/what-anycpu-really-裝置-AS-的淨4-5和 - 視覺工作室11.aspx)。 – svick 2012-04-15 12:34:07

+0

@Polynomial抱歉編輯你的答案。我以爲這是我的桌子...恢復... – 2012-04-15 12:36:01

+0

問題:我對64位進程。我也有一個編譯爲32位的DLL。這個DLL有一個方法獲取作爲參數 - 詮釋。因爲DLL被編譯爲32位 - int的大小是4個字節。但如果我的64位進程使用自己的int調用此函數 - 它將發送method8字節int ...所以會發生什麼? – 2012-06-04 15:21:52

0

這取決於Opertaing系統platofrm和目標編譯類型。

+0

所以@Polynomial是錯的? – 2012-04-15 12:30:03

+0

目標編譯類型確實有所作爲。如果編譯爲32位,並在64位操作系統上運行,則不會獲得64位代碼。 – Polynomial 2012-04-15 12:31:00

+0

@RoyiNamir:它*似乎對我來說它說的完全一樣..所以32/64位是關於操作系統而不是處理器..不是嗎? – Tigran 2012-04-15 12:31:27

3

我會寫表是這樣的:

 target |  OS  | IntPtr.Size 
______________________________________ 
     x64   32  wont run 
     x64   64   8 
    AnyCPU   32   4 
    AnyCPU   64   8 
     x86   32   4 
     x86   64   4 

憑藉強大的暗示,你總是希望目標AnyCPU從不64。如果你知道你需要使用非託管代碼(通常是COM服務器),那麼只有在32位機器代碼中才可以訪問x86。

+0

運行'是關於操作系統,而不是CPU ...對嗎? – 2012-04-15 12:35:06

+0

請記住,還有其他用於明確設置x86的用例,例如處理由外部供應商編譯爲x86的.NET庫。我見過人們在32位機器上開發,將目標作爲AnyCPU,然後讓代碼在64位客戶機器上崩潰,因爲32位庫不會加載。 – Polynomial 2012-04-15 12:38:30

+0

那麼,這是可以修復的,只需運行corflags.exe即可進行更改。 – 2012-04-15 12:39:15

1

你必須得到正確的順序。 將代碼編譯爲IL時,可以選擇32,64或任何CPU。 當IL獲取JIT編譯爲本地時,它會查看它在PE頭中)。如果你強制使用它,它會將JIT(除非你強制使用64位,而你使用的是32位操作系統!)對操作系統的位數進行調整。

所以sizeof會告訴你你的IL編譯的本地代碼的位數。

你不能依靠它來告訴你該處理器(32位操作系統在64位芯片上)中位數

,你不能依賴它在告訴你的操作系統(32所處理的位數64位操作系統)

如果它返回爲8位,那麼你在64位操作系統上,因此必須在64位芯片上,因爲除非我們有128位芯片和操作系統,否則沒有其他辦法可以發生。 。

如果它回來4,那麼你必須做不同的檢查來發現操作系統或芯片的位數。