Ich habe mir die MSDN-Dokumentation angesehen und bin immer noch ein wenig verwirrt darüber, was genau der Unterschied zwischen der Verwendung LoadFile
und LoadFrom
dem Laden einer Baugruppe ist. Kann jemand ein Beispiel oder eine Analogie liefern, um es besser zu beschreiben? Die MSDN-Dokumentation hat mich mehr verwirrt. Ist auch ReflectionOnlyLoadFrom
dasselbe wie mit der LoadFrom
Ausnahme, dass die Baugruppe nur im Reflexionsmodus geladen wird.
Da meine .NET-Erfahrung nicht die größte ist, sind hier einige Fragen zur MSDN-Dokumentation mit LoadFile:
1) Was bedeutet es, LoadFile
Baugruppen zu untersuchen, die dieselbe Identität haben, sich aber auf unterschiedlichen Pfaden befinden? Was ist die Identität (Beispiel)?
2) Es gibt an, LoadFile
dass keine Dateien in den 'LoadFrom-Kontext' geladen werden und Abhängigkeiten nicht über den Ladepfad aufgelöst werden. Was bedeutet das, kann jemand ein Beispiel geben?
3) Schließlich wird angegeben, dass LoadFile
dies in diesem eingeschränkten Szenario nützlich ist, da LoadFrom keine Assemblys laden kann, die dieselben Identitäten, aber unterschiedliche Pfade haben. Es wird nur die erste derartige Assembly geladen, was mich erneut zu der gleichen Frage bringt: Was ist die Identität der Assemblys?
Antworten:
Klärt das auf?
Bearbeiten : Um die Fragen zu beantworten, die Sie in Ihrer überarbeiteten Frage aufgeworfen haben, möchten Sie auf jeden Fall Suzanne Cook über die Identität der Versammlung lesen .
Es gibt viele Regeln, die regeln, wie Assemblys geladen werden, und einige davon haben damit zu tun, wie sie Abhängigkeiten auflösen. Wenn Ihre AssemblyA von AssemblyB abhängig ist, wo sollte .NET nach AssemblyB suchen? Im Global Assembly Cache das gleiche Verzeichnis, in dem AssemblyA gefunden wurde, oder irgendwo anders? Wenn mehrere Kopien dieser Baugruppe gefunden werden, wie sollte sie dann auswählen, welche verwendet werden soll?
LoadFrom
hat einen Satz von Regeln, währendLoadFile
hat einen anderen Satz von Regeln. Es ist schwer vorstellbar, warum viele Gründe verwendet werdenLoadFile
müssen. Wenn Sie jedoch verschiedene Kopien derselben Baugruppe reflektieren müssen, ist dies für Sie da.quelle
string.Compare(x, y) == 0
? Ich denke du willstx == y
da? Wenn Sie aus unklaren Gründen eine kulturabhängige Gleichstellungsprüfung wünschen, ist es beispielsweise klarer zu schreibenstring.Equals(x, y, StringComparison.CurrentCulture)
.Aus dem Blog von Suzanne Cook :
Siehe hier .
Siehe auch Auswählen eines verbindlichen Kontextartikels im selben Blog.
quelle
Nach vielem Kopfkratzen habe ich heute Nachmittag selbst einen Unterschied entdeckt.
Ich wollte zur Laufzeit eine DLL laden, und die DLL befand sich in einem anderen Verzeichnis. Diese DLL hatte ihre eigenen Abhängigkeiten (DLLs), die sich ebenfalls in demselben Verzeichnis befanden.
LoadFile (): Die spezifische DLL wurde geladen, nicht jedoch die Abhängigkeiten. Als der erste Aufruf innerhalb der DLL an eine dieser anderen DLLs erfolgte, wurde eine FileNotFoundException ausgelöst.
LoadFrom (): Lud die von mir angegebene DLL sowie alle Abhängigkeiten, die in diesem Verzeichnis lebten.
quelle
FileNotFoundException
beim Erstellen einer neuen Instanz eines Objekts erhalten, das in einer Assembly definiert ist, auf die von der Assembly verwiesen wird, mit der ich gerade geladen habe.LoadFile
. Das.LoadFrom
zu ändern schien das Problem zu beheben, aber ich wusste nicht warum! Vielen DankHinweis: Wenn eine Assembly über einen 8.3-Pfad und dann über einen Nicht-8.3-Pfad geladen wird, werden sie als unterschiedliche Assemblys angezeigt, obwohl es sich um dieselbe physische DLL handelt.
quelle
.NET hat einen anderen Ladekontext. Suzanne Cook schrieb hier darüber: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx
Dies ist die Art und Weise, wie .Net-Quarantänen, dass Referenzen nicht verwechselt werden.
quelle
Ein Unterschied, den ich bemerkt habe, ist:
Assembly.LoadFile - Lädt Assemblys in verschiedenen AppDomains mit eingeschränkten Benutzerrechten (Differenzprinzip). Operationen wie Serilisierung / Deserilisierung konnten nicht durchgeführt werden.
Assembly.LoadFrom - Lädt die Assembly in dieselbe AppDomain mit denselben Benutzerrechten (dasselbe Prinzip).
quelle
In meinem Fall musste ich nur den ASP-Anwendungscache @ löschen
C:\Windows\Microsoft.NET\Framework\[asp version]\Temporary ASP.NET Files
. Es wird neu erstellt, wenn die Site zum ersten Mal ausgeführt wird. Stellen Sie sicher, dass Sie IIS zuerst stoppen.Hoffe das hilft jemandem wie es für mich getan hat.
quelle