2008-12-09 11 views
10

Nach this article ist eine erneute Speicherung für .NET-Assemblies aufgrund der JIT-Kompilierung des Codes nicht erforderlich. Der Artikel besagt:. NET-Assemblies und DLL-Neufassung

"JIT-compiled-Code hat kein Umgehungsproblem, da die Adressen zur Laufzeit basierend auf dem Speicherort des Codes generiert werden. MSIL wird selten von Basisadresse seit MSIL betroffen Referenzen sind tokenbasiert und nicht adressbasiert. Wenn also der JIT-Compiler verwendet wird, ist das System widerstandsfähig gegen Grundadressenkollisionen. "

aber ich habe bemerkt, dass VS2008 die Adresse Standard 0x0400000 Basis ordnet alle Baugruppen (Projekteigenschaften> Aufbau> Fortgeschrittene) und wenn ich ein listdlls /r für meinen Prozess zu tun all meine .NET-Assemblies sind in der Tat pro Standard umbasiert.

Wenn ich selbst Adressen zuweise, wird keine Umbasierung durchgeführt.

Meine Frage ist: Was ist in diesem Fall rebased und warum?

EDIT: Ich sollte hinzufügen, dass ich nicht über NGen'ed Baugruppen sprechen.

Antwort

3

Der CLR-Lademechanismus verwendet LoadLibrary im Hintergrund, dies ist also Folgendes: 2 Assemblys können nicht an derselben Adresse geladen werden. Nun, was Leute oft meinen, wenn sie versuchen, eine DLL zu rebasen, ist, die Perf zu vermeiden. Treffer von Verbesserungen, z.B. Absolute Adressen & Funktionsaufrufe müssen mit der geladenen Basisadresse "verschoben" werden. CLR hat dieses Problem nicht (nicht sicher über statische Daten in der Anwendung, die der zweite Teil dieser Korrekturen ist, würde ich darüber nachlesen müssen), weil MSIL-Code auf Abruf geladen wird, wenn Sie eine Funktion aufrufen im verwalteten Code. Die MSIL wird dann auf den Heap versetzt und auf den Heap gestellt, ein anderer als der normale Objekt-Heap. Ich glaube, in der gleichen Weise, wie CLR neue Objekte in Ihrer Anwendung zuweist und verteilt.

+0

Ich verstehe, dass es keinen Grund für die Korrekturen gibt, aber da wir Baugruppen von einem Netzlaufwerk laden, kann ein Rebasing aufgrund des Kopierens in den Auslagerungsdatei-Teil des Rebasings ein Problem werden. Jede Verbindung mit Details würde geschätzt werden. Vielen Dank. –

+1

AFAIK, copy-to-pagefile ist das direkte Ergebnis dieser Korrekturen, da Seiten mit ausführbarem Code beschreibbar/privat für den Prozess werden, so dass das Betriebssystem sie nicht mehr direkt von der DLL laden kann. Meinst du das? – liggett78

+0

Es gibt einen alten (scheint wie aus dem Mittelalter) aber noch wertvollen Artikel bei http://msdn.microsoft.com/en-us/library/ms810432.aspx von vor 13 Jahren über Rebasing (native code). – liggett78

0

Welches Betriebssystem laufen Sie? Ich weiß, dass die Aussicht und darüber hinaus ASLR eingeführt, die den Adressraum randomisiert, in den es geladen wird. Dies geschieht für System-DLLs, aber nicht sicher über .net - vielleicht etwas, in das man schauen kann.