2008-10-29 51 views
5

道歉,如果我所說的任何內容都沒有意義或忽視某些顯而易見的事情 - 我對CLR內部知識的瞭解是多餘的。x64 .NET編譯/進程資源管理器奇怪

如果我理解正確,那麼如果我只是在VS2K5中爲'AnyCPU'創建一個解決方案(或者使用這些設置指向帶有.sln文件的MSBuild),那麼二進制文件只能編譯到MSIL。如果在32位平臺或64位代碼上執行,那麼他們會在32位上執行JIT操作(如果在64位上執行的話)

該DLL用於Web應用程序並在W3WP.exe進程中託管。 Process Explorer告訴我W3WP是一個64位的進程。

但是,當我使用進程資源管理器來檢查DLL視圖中的這些DLL之一的屬性,它說:'圖像:32位'。是什麼賦予了?

如果我針對有問題的dll運行corflags,它告訴我:ILONLY 1,32BIT 0但是PE PE32。我的理解是,這意味着它只是編譯到IL,不,它不限於32位或64位,但我不完全清楚。 PE32標誌是否與它顯示爲32位一樣?

回答

5

你的問題是關於this question。在進程資源管理器中看到的是圖像的類型,它與程序集的corflags中指定的「運行時兼容性」類型不同。

設置「任何Cpu」的目的是強制原生圖像和程序集中最常見的分母,以便它讓Windows的Windows啓動程序選擇哪種運行時將是最合適的目前的平臺。

因此,對於您的示例,您確實有一個包含「任意CPU」程序集(由程序集CorFlags指定)的32位圖像(由PE標題指定)。

2

然後,如果在32位平臺或64位代碼上執行操作(如果在x64上執行的話),它們將被打到32位......對吧?

正確的,你可以通過執行編譯AnyCPU相同的exe檢查:

的sizeof(IntPtr的)== 4 //真正的在32位

的sizeof(IntPtr的)== 8 //真在64位上

但是,如果您的程序集僅在爲32位平臺編譯的進程中引用,它將被激活爲32位(在64位Windows中運行WOW)。

+0

謝謝:) 任何想法爲什麼Process Explorer是惡作劇? – 2008-10-29 17:10:39