2008-10-29 10 views
5

Entschuldigung, wenn etwas von dem, was ich sagen werde, keinen Sinn ergibt oder etwas Offensichtliches übersieht - mein Wissen über CLR-Interna ist spotty.x64 .NET-Kompilierung/Process Explorer Kuriosität

Wenn ich richtig verstehe, wenn ich nur eine Lösung für "AnyCPU" in VS2K5 erstellen (oder MSBuild auf diese SLN-Datei mit diesen Einstellungen zeigen) dann kompilieren die Binärdateien nur so weit wie MSIL. Sie erhalten dann JITted zu 32-Bit, wenn auf einer 32-Bit-Plattform oder 64-Bit-Code ausgeführt, wenn auf x64 ausgeführt ... oder?

Die DLLs werden für eine Webanwendung verwendet und im W3WP.exe-Prozess gehostet. Process Explorer sagt mir, W3WP ist ein 64-Bit-Prozess.

Aber wenn ich Process Explorer verwenden, um die Eigenschaften eines dieser DLLs in der DLL-Ansicht zu überprüfen, heißt es: "Image: 32-Bit". Was gibt?

Wenn ich corflags gegen die DLL in Frage läuft, sagt es mir: ILONLY 1, 32BIT 0 aber PE PE32. Mein Verständnis ist, dass dies bedeutet, dass es nur so weit wie IL kompiliert wird, nein, es ist nicht auf 32 Bit oder 64 Bit beschränkt, aber ich bin nicht ganz klar. Hat das PE32-Flag irgendetwas damit zu tun, dass es als 32-Bit wie oben angezeigt wird?

Antwort

5

Ihre Frage bezieht sich auf this question. Was Sie im Prozess-Explorer sehen, ist der Image-Typ, der sich vom Typ "Laufzeitkompatibilität" unterscheidet, der im Assembly corflags angegeben ist.

Der Punkt der Einstellung "Any Cpu" ist die Erzwingung der häufigsten gemeinsamen Nenner in der nativen Bild und die Assembly, so dass die Windows Bootstrapper für. NET wählen, welche Art von Runtime am besten geeignet ist aktuelle Plattform.

Für Ihr Beispiel haben Sie also ein 32 Bit-Bild (wie vom PE-Header angegeben), das eine Baugruppe "Beliebige CPU" enthält (wie von den CorFlags für die Baugruppe angegeben).

2

Sie erhalten dann JITted zu 32-Bit, wenn auf einer 32-Bit-Plattform oder 64-Bit-Code ausgeführt, wenn auf x64 ausgeführt ... oder?

Rechts können Sie überprüfen, indem Sie die gleiche exe für AnyCPU zusammengestellt Ausführung:

sizeof (IntPtr) == 4 // true auf 32bit

sizeof (IntPtr) == 8 // true on 64bit

Wenn Ihre Assembly jedoch in einem Prozess referenziert wird, der nur für eine 32-Bit-Plattform kompiliert wurde, wird sie auf 32bit (in WOW für 64-Bit-Windows) ausgeführt.

+0

danke :) eine Idee warum Process Explorer boshaft ist? –