2011-12-08 42 views
7

我最近開始了一項新工作,並且我注意到每個人都在談論的第一件事情之一是將我們的.NET應用程序更新爲全部 x64。我最初認爲這很奇怪,因爲我們都知道.NET編譯爲平臺不可知的IL,並且特定的CLR運行代碼。什麼時候在Visual Studio中定位到x64

看遠一點,我發現this helpful articlethis SO post這有助於解釋的事情。

所以,現在我明白了IL沒有改變,只是元數據基本上是說在WOW64在x64系統上運行或不(簡而言之)。

所以,如果我是一個x64系統上,我可以指定「任何CPU」到本地運行,但不支持32位的DLL;我可以指定支持32位dll的「x86」(因爲它們都將在WOW64下運行); 但我何時會指定「x64」?似乎64位dll將在x64系統的「任何CPU」方案中得到支持。如果我想阻止某人在32位系統上運行我的應用程序,或者在嘗試加載32位dll時確保失敗,這是否是這種情況?

在我看來,如果你有一些第三方的dll在你的項目中擔心,你會想只有需要將它設置爲「任何CPU」以外的東西。是否最好將其作爲任何其他項目的「任何CPU」,而不處理其他dll?

如果我碰巧把我的目標設置爲「x86」是因爲我有一個32位的第三方dll,那麼我的應用程序實際上是否被認爲是在64位系統下運行,如果是在64位系統下的WOW64?

+1

您不能在安裝程序中忽略它。如果您有x64要求,則必須將安裝程序的TargetPlatform設置設置爲x64。如果你不這樣做,它將無法正確安裝。由於安裝程序現在已確保可以使用64位操作系統,因此現在它不再是您爲EXE項目選擇的內容。不妨使用AnyCPU。 –

回答

7

是的,你會指定該項目應編譯,如果你調用一個DLL,它本身是64位(可能是因爲它是天然的,或者是託管的DLL這本身調用64位本機DLL,等到x64 )。

同樣,如果你正在處理32位的第三方DLL,指定它應該是x86;如果在64位版本的Windows上運行,它將不被視爲64位應用程序。

如果你只是處理純粹的託管代碼,那麼我會留下任何東西作爲「任何」。即使可執行文件被指定爲x86或x64,我通常也將DLL保留爲「任何」。

而且,即使你正在處理的本機DLL,你仍可以用把它當作脫身「任何」,如果你正在使用的PInvoke;你可以有一個包含它的類的兩個版本,一個用於x86,一個用於x64,並通過檢查IntPtr.Size屬性來選擇在運行時使用哪一個版本。

和當然,如果你的應用需要超過4個GB的RAM和要強制執行,它必須在64位操作系統上運行,那麼你還需要針對64位。

+0

很多時候,您可以使用相同的p/invokes進行32位和64位 –

2

如果您通過COM或P/Invoke使用沒有32位版本的本機代碼,則可以指定x64。

相關問題