2015-01-11 13 views
7

Aus welchem ​​Grund werden nicht alle Assemblys im Global Assembly Cache (GAC) als MSIL erstellt? Ich sehe x86 und AMD64 Architekturtypen für einige Baugruppen verwendet wird, wie im Beispiel unten, aber nicht für andere:Warum werden nicht alle Assemblys in GAC als MSIL erstellt?

C:\Windows\assembly\

enter image description here

Warum System.Data für zwei verschiedene Prozessorarchitekturen aufgebaut ist, während System.Core ist MSIL?

C:\Windows\Microsoft.NET\assembly

enter image description here

Ein ähnliches Muster kann unter der zweiten Version von GAC, oben gezeigt, gesehen werden. Assemblies sind in verschiedene Architekturen aufgeteilt, aber nicht alle sind in 32/64 Versionen integriert - einige sind nur MSIL.

+1

Sie haben eine Compiler-Optimierung und Ziele für die Architektur. Für eine höhere Version von .NET sind diese Optimierungen im C# -Compiler gemischt. – VMAtm

Antwort

7

Wenn Sie Ihre Bibliothek kompilieren, können Sie entweder "Any CPU" oder eine bestimmte Prozessorarchitektur auswählen.

Die Bibliotheken "Any CPU" benötigen nur einen einzigen Eintrag im GAC und die gesamte Assembly wird nach MSIL kompiliert.

Andere Baugruppen benötigen für jede Architektur eine andere Bibliothek. Diese Bibliotheken werden für jeden CPU-Typ erstellt und es gibt mehrere Kopien im GAC. Der häufigste Grund besteht darin, nicht verwalteten Code einzuschließen oder eine native DLL zu laden, die architekturspezifisch ist.

In Ihrem Beispiel ist System.Core wahrscheinlich vollständig verwalteten Code, während System.Data wahrscheinlich auf einem Haufen nativer Windows-Bibliotheken aufgebaut ist.

Anwendungen im 32-Bit-Modus laden die 32-Bit-Version der Bibliothek, während Anwendungen im 64-Bit-Modus die 64-Bit-Version laden.

+0

Danke, das macht Sinn. –