Wie kann ich feststellen, ob die systemeigenen Images verwendet werden, ohne dass der Loader die Signatur der Assembly zur Laufzeit überprüft oder gar die GAC-Baugruppe verwendet?
Ich habe ein komplexes System, das wir mit NGen experimentieren, aber derzeit führen wir die exe aus dem Ordner, in dem sich alle DLLs befinden, aufgrund der vielen späten Bindungsabhängigkeiten. Wenn man Process Explorer betrachtet, sieht es wie der Native aus Bilder werden verwendet, aber wie kann ich sicher sein, dass ich den vollen Nutzen erhalte und den Loader Verification-Schritt eliminiere?
Prost, Graeme.
Aktualisierung: Ich bekomme eine Menge solcher Dinge aus dem Assembly Binding Log Viewer:
%Vor%und am Ende
%Vor%Es werden also die Native-Images verwendet, aber immer noch überprüft, d. h. die GAC-Version wird nicht verwendet, obwohl ich dort das Native-Image erstellt habe, etwa so:
%Vor%Fußnote: Diese Artikel scheinen zu implizieren, dass, wenn die Baugruppen nicht aus dem GAC geladen werden, der Verifizierungsprozess die Vorteile von NGen aufwiegen wird? CLR Inside Out - Verbesserung der Anwendungsstartleistung (MSDN)
Update - Wie von Nobugz unten in einem Kommentar erwähnt, wird der oben erwähnte Verifikationsschritt seit 3.5 SP1 nicht ausgeführt: MSDN-Dokumente auf NGen
Sie können es leicht aus dem Fuslogvw.exe-Tool sehen. Starten Sie es über die Visual Studio-Eingabeaufforderung. Konfigurieren Sie es mit Protokollkategorien = Native Images, Einstellungen + Protokolliert alle Bindungen an die Festplatte. Führen Sie Ihr Programm aus. Zurück zu fuslogvw, Aktualisieren. Es zeigt Ihnen eine Liste aller Baugruppen, die geladen wurden.
Doppelklicken Sie auf einen Eintrag, um zu sehen, wie die Assembly geladen wurde. Wenn es vom GAC kommt, werden Sie sehen:
LOG: IL-Assembly geladen von C: \ Windows \ Assembly \ GAC_MSIL \ blahblah
Wenn die Ngen-Bilder verwendet wurden, sehen Sie:
LOG: Bindung an natives Bild erfolgreich.
Sie können sehen, ob die Baugruppe ziemlich einfach aus dem GAC kam:
%Vor%BEARBEITEN: einen Weg gefunden ...
Um zu sehen, ob es NGEN ist, müssen Sie die Assembly direkt lesen und sehen, ob das Precompile Header Feld Daten gemäß diese Seite . Ich bin ein bisschen eingerostet, um diesen Wert zu erreichen, aber das sollte es tun. Ich sehe keinen Weg, es über die Reflektionsmethoden herauszufinden.
Sie können die VMMAP verwenden. Dort haben alle .dll (Assembly) Standortdetails
Im Detail, wenn Ihre Assembly von "C: \ Windows \ Assembly \ NativeImages (version) ..." geladen wird, damit Ihre Anwendung das native Image verwendet.