2012-07-21 58 views
2

的.NET 4全局程序集緩存分爲2個文件夾:本機代碼和.NET託管代碼4

C:\ WINDOWS \ Microsoft.NET \裝配\ GAC_32

C:\ WINDOWS \ Microsoft.NET \程序集\ GAC_MSIL

我對GAC_32文件夾很感興趣。我是否應該假設該文件夾中的程序集(如System.Data)是本機代碼而不是託管代碼?它是x86特定的?

+0

請花點時間接受一些您的問題的答案。我通常不會發表這樣的評論(我不喜歡他們),但25%的接受程度相當低。 – IAbstract 2012-07-21 16:35:57

回答

1

GAC_32和GAC_64包含混合模式程序集。包含託管代碼和本機代碼的程序集。它們是從C++/CLI編譯器生成的代碼生成的,該編譯器知道如何從託管代碼輕鬆調用本地代碼,而無需使用pinvoke。彙編格式足夠靈活以支持這兩種代碼。一個死的贈品是用反彙編器在全局命名空間中看到<Module>類。

鑑於它們包含本機代碼,它們對機器體系結構有很大的依賴性。因此,您需要在64位計算機上分別安裝該程序集的副本。 GAC_32和GAC_64文件夾存儲這些單獨的副本,CLR會根據進程的位數自動選擇正確的副本。

沒有那麼多混合模式的框架程序集。 Mscorlib.dll是一個,它接近操作系統。 System.Data.dll對數據庫提供程序有很強的依賴性,這些提供程序都只能在本機代碼中使用。 WPF的PresentationCore.dll對Milcore有很強的依賴性,Milcore是一個與DirectX接口的本地層。等等。

2

如果您使用AnyCPU平臺編譯程序集,它會轉到MSIL文件夾,如果您使用x86平臺編譯它,它會轉到GAC_32。 More details here

您可以使用CorFlags來確定程序集是否是86,64或AnyCPU

0

體面的解釋here

的GAC_MSIL緩存包含可以在任一 32位或64位模式下運行,並且根據需要被JIT編譯到所需字長 組件。

32/64目錄包含專用於32位或64位模式的程序集,因爲它們包含本機代碼或 ,因爲它們對字大小做出特定假設。

32位系統只有GAC_32目錄。一個64位系統 將有兩個,因爲通過仿真(WOW32)支持32位代碼。

我知道有一些爭論到NGEN-ED組件是否是真正快於MSIL,由於JIT-ED組件能夠被優化給定當前運行時條件(#核,架構等)

+0

關於最後一段(性能):IIRC'ngen''ed程序集運行速度可能不會更快,但*加載速度更快。 – stakx 2012-07-21 16:41:03

+1

是的,但他們可能運行速度較慢。我想這就是折衷。 – cunningdave 2012-07-21 16:42:46