2015-01-11 6 views
7

グローバルアセンブリキャッシュ(GAC)内のアセンブリのすべてがMSILとして構築されていないのはなぜですか? System.Coreされている間GACのすべてのアセンブリがMSILとして構築されていないのはなぜですか?

C:\Windows\assembly\

enter image description here

なぜSystem.Dataは、二つの異なるプロセッサアーキテクチャ用に構築されている:私は、以下の例のようにではなく、他人のためのいくつかのアセンブリのために使用x86AMD64アーキテクチャタイプは、参照しますMSIL

C:\Windows\Microsoft.NET\assembly

enter image description here

同様のパターンが上に示され、GACの第2のバージョンの下で見ることができます。アセンブリは異なるアーキテクチャに分割されていますが、それらのすべてが32/64バージョンに組み込まれているわけではありません - 一部はMSILです。

+1

コンパイラの最適化とアーキテクチャのターゲットを持っています。より高いバージョンの.NETでは、これらの最適化はC#コンパイラで混在しています。 – VMAtm

答えて

7

ライブラリをコンパイルするときに、「任意のCPU」または特定のプロセッサアーキテクチャを対象にすることができます。

"Any CPU"ライブラリは、GAC内に1つのエントリしか必要なく、アセンブリ全体がMSILにコンパイルされます。

他のアセンブリでは、アーキテクチャごとに異なるライブラリが必要です。これらのライブラリは各CPUタイプ用に構築されており、GACには複数のコピーがあります。最も一般的な理由は、アンマネージコードを含めるか、アーキテクチャ固有のネイティブDLLをロードすることです。

あなたの例では、System.Coreはおそらく完全に管理されたコードですが、System.Dataはおそらくネイティブウィンドウライブラリの束の上に構築されています。

32ビットモードで動作するアプリケーションは32ビットバージョンのライブラリをロードしますが、64ビットモードで動作するアプリケーションは64ビットバージョンをロードします。

+0

ありがとうございます。 –

関連する問題