2010-06-01 55 views
10

我有一個針對.NET 2.0編寫的現有C#應用程序,目標是AnyCPU。它目前引用了一些第三方.NET DLL,我沒有它的源代碼(我不確定它們是否爲x86,x64或AnyCPU構建)。在構建64位窗口時針對x86與AnyCPU操作系統

如果我想在64位Windows操作系統上專門運行我的應用程序,那麼我應該定位哪個平臺以使我的應用程序無錯地運行?我當時的理解是目標:

  • :如果至少有一個第三方的.NET的DLL是專爲x86或使用P/Invoke來的Win32 DLL的接口。應用程序將在32位和64位操作系統上以32位模式運行。
  • x64:如果所有第三方.NET dll已經爲x64或AnyCPU構建。應用程序只能在64位操作系統中運行。
  • AnyCPU:如果所有第三方.NET dll已經爲AnyCPU構建。應用程序將在32位操作系統上以32位模式運行,在64位操作系統上以64位運行。

而且,我是有權認爲,雖然針對AnyCPU將產生沒有錯誤構建應用程序中引用第三方的x86 .NET的DLL時,應用程序將引發運行時異常時,它會嘗試在運行時加載這些DLL在64位操作系統上。

因此,只要我的第三方DLL中的一個正在執行p/Invoke或x86,我只能針對此應用程序的x86目標?

回答

7

你可以從AnyCPU DLL中進行P/Invoke,只需要對P/Invoke定義(即你不會無意中假設32位或某物)有點小心。問題在於,很難知道第三方DLL是否在沒有Reflector的情況下做正確的事情並對其進行反彙編(除非開發人員明確指出64位支持)。

但除此之外,你幾乎可以找到。

說實話,對於99%的應用程序來說,瞄準x86是完全可以接受的。這是相對較少的實際上受益於64位的應用程序。 (性能問題通常只是一點點洗滌:更多的寄存器被x86模式和更大的數據結構的寄存器重命名所抵消,因爲指針是兩倍大[並且在像.NET這樣的參考系統中甚至更糟])

7

我很好奇你的問題的這個特定部分。

而且,我說的對相信,在建設 引用第三方的x86 .NET的DLL一個應用程序時 打靶AnyCPU將不產生 錯誤, 應用程序將引發運行時異常 當它試圖加載這些 DLL在64位操作系統上運行時。

所以我試了一下。我創建了一個針對x86的DLL項目ClassLibrary1,然後添加了一個針對AnyCPU的ConsoleApplication1並引用了另一個項目。我確保實際使用Main方法中的ClassLibrary1項目中的類。

Visual Studio不給我任何有關引用或構建應用程序的警告或投訴。當我運行應用程序(在64位操作系統上)並且加載了ClassLibrary1程序集時,我遇到了一個BadImageFormatException異常。

如果我將ConsoleApplication1更改爲目標x64,則會收到編譯器警告,但編譯成功並且運行時發生相同的異常。

所以要回答你的問題,是的,如果你引用的程序集(或者在運行時加載的任何程序集)沒有爲AnyCPU編譯,你也可能會遇到麻煩。如果你不確定,並且你不需要額外的地址空間,我會堅持瞄準x86。如果你確定你的依賴關係是爲AnyCPU編譯的,那麼你可以定位AnyCPU,但是一定要在兩個處理器體系結構中進行大量的測試。

+0

AnyCPU是我的VS實例的默認目標平臺,當你除了.NET框架之外沒有其他的依賴關係時,這是毫無疑問的。一旦引入了其他依賴關係,則假定應用程序將繼續在64位平臺上工作,僅僅是因爲應用程序針對AnyCPU並編譯沒有問題,這將是一件痛苦的事情。謝謝回答 :) – anonymous 2010-06-01 05:37:49

相關問題