2011-07-19 110 views
5

我必須將項目從32位升級到64位。我的項目目前在.net 2.0(即將推出4.0,但對這個問題無關緊要)。我的項目引用了一些舊的.net 1.1程序集,我只能用二進制形式。衆所周知,64位支持僅在.net 2.0中添加,並且我預計我的應用程序將不會運行,因爲這些舊程序集。從64位應用程序引用.net 1.1程序集

但是,我的應用程序在64位模式下運行在x64服務器上(沒有星號顯示在任務管理器中),同時引用.net 1.1 dll。

我的問題是:

  1. 爲什麼它運行?我以前讀過,你不能在64位應用程序中使用.NET 1.1 程序集。
  2. 如果我保留1.1程序集,是否有任何缺點?或者我應該投入努力獲取這些1.1程序集的更新版本?

編輯:我忘了提及一個要求是在64位本地運行應用程序(asp.net)。該應用程序運行在64位,因爲我禁用了我的應用程序池的32位兼容性。

編輯2:我只是試圖編譯和運行爲x64編譯的應用程序。有用。所以它運行在純64位模式下,沒有任何問題。

+0

我認爲你的程序集在32兼容模式下運行。所以它將不做任何改變。 – VMAtm

回答

6

.NET 1.1程序集包含與.NET 2或.NET 4程序集相同類型的IL。只有元數據的格式發生了變化。抖動並不介意將其轉換爲64位機器碼,CLR可以讀取舊的元數據格式。只有在.NET 1.1程序集包含本機代碼時,您纔會遇到問題。 Corflags.exe實用程序,ILONLY位。沒有重要的理由來重建該裝配。

+0

因此,我假設.NET 1.1構建與PE32標頭的程序集,並且它不會在CLR標頭中發出32位唯一標誌嗎? –

+0

是的,程序集是ILONLY(實際上,如果我理解正確,所有.net 1.1程序集都是ILONLY)。我怎樣才能知道我的二進制程序集是否通過平臺調用調用本地代碼? – user328087

+0

這與pinvoke沒有任何關係。您可以使用C++/CLI編譯器在程序集中獲取本機機器碼。那麼,在1.1天內託管C++。對於64位版本的Windows,舊代碼中的pinvoke聲明肯定是無效的,在需要IntPtr的情況下使用int是一個常見的錯誤。這需要一個調試器。 –

0

您的應用程序是否在wow32(32位仿真模式)下運行?大多數應用程序並不真正以x64模式運行,它們強制應用程序以wow32(x86模式)運行,以保持其在舊x86系統上的向後兼容性。否則,應用程序只能在x64系統上運行,而不能在x86上運行。

強制應用程序在x86模式下運行(即使在x64系統上)也可以運行在任何機器上,無論它是32位還是64位Windows操作系統。

+0

我的應用程序以純64位模式運行。它在x64中編譯,在應用程序池中禁用了32位兼容性,並且在任務管理器中沒有星號。 – user328087

相關問題