wake-up-neo.com

Unterschied zwischen LoadFile und LoadFrom mit .NET-Assemblies?

Ich habe mir die Msdn-Dokumentation angesehen und bin immer noch etwas verwirrt, was genau der Unterschied zwischen LoadFile und LoadFrom beim Laden einer Assembly ist. Kann jemand ein Beispiel oder eine Analogie geben, um es besser zu beschreiben. Die MSDN-Dokumentation verwirrte mich mehr. Ist ReflectionOnlyLoadFrom dasselbe wie LoadFrom, außer dass die Assembly nur im Reflektionsmodus geladen wird.

Da meine .NET-Erfahrung nicht die beste ist, sind hier einige Fragen zur MSDN-Dokumentation mit LoadFile:

1) Was bedeutet es, wenn LoadFile Baugruppen untersucht, die dieselbe Identität haben, aber auf unterschiedlichen Pfaden liegen? Was ist die Identität (Beispiel)?

2) Es gibt an, dass LoadFile keine Dateien in den 'LoadFrom Context' lädt und keine Abhängigkeiten über den Ladepfad auflöst. Was bedeutet das, kann jemand ein Beispiel geben?

3) Schließlich wird angegeben, dass LoadFile in diesem eingeschränkten Szenario nützlich ist, da LoadFrom keine Baugruppen laden kann, die die gleiche Identität, jedoch unterschiedliche Pfade haben. es wird nur die erste solche Assembly geladen, was mich wiederum zu der gleichen Frage bringt, wie ist die Identität der Assemblys?

110
Xaisoft

Ist das klarer?

// path1 and path2 point to different copies of the same Assembly on disk:

Assembly assembly1 = Assembly.LoadFrom(path1);
Assembly assembly2 = Assembly.LoadFrom(path2);

// These both point to the Assembly from path1, so this is true
Console.WriteLine(Assembly1.CodeBase == Assembly2.CodeBase);

Assembly1 = Assembly.LoadFile(path1);
Assembly2 = Assembly.LoadFile(path2);

// These point to different assemblies now, so this is false
Console.WriteLine(Assembly1.CodeBase == Assembly2.CodeBase);

Edit: Um die Fragen zu beantworten, die Sie in Ihrer überarbeiteten Frage gestellt haben, möchten Sie auf jeden Fall Suzanne Cook über Assembly Identity lesen.

Es gibt viele Regeln, die bestimmen, wie Assemblys geladen werden, und einige davon haben mit der Auflösung von Abhängigkeiten zu tun. Wenn Ihre AssemblyA von AssemblyB abhängig ist, wo sollte .NET nach AssemblyB suchen? Im globalen Assemblycache fand das gleiche Verzeichnis AssemblyA oder an einem anderen Ort? Wenn es mehrere Kopien dieser Assembly findet, wie sollte sie dann entscheiden, welche verwendet werden soll?

LoadFrom hat einen Satz von Regeln, während LoadFile einen anderen Satz von Regeln hat. Es gibt kaum Gründe, LoadFile zu verwenden, aber wenn Sie die Reflektion für verschiedene Kopien derselben Assembly verwenden müssen, ist dies für Sie da.

87
Jeff Sternal

Aus Suzanne Cooks Blog :

LoadFile vs. LoadFrom

Seien Sie vorsichtig - das ist nicht dasselbe. Ding.

LoadFrom () durchläuft Fusion und kann zu einem anderen .__ umgeleitet werden. Montage auf einem anderen Pfad, jedoch mit Dieselbe Identität, wenn bereits eine in den LoadFrom-Kontext geladen.

LoadFile () bindet sich überhaupt nicht durch Fusion - der Loader geht einfach voraus und lädt genau * was der Anrufer angefordert. Es verwendet nicht entweder das Load oder das LoadFrom Kontext.

So gibt Ihnen LoadFrom () normalerweise was Sie haben gefragt, aber nicht unbedingt . LoadFile () ist für diejenigen, die wirklich Ich will wirklich genau das, was angefordert wird. (* Ab Version 2 wird die Richtlinie jedoch auf LoadFrom () und LoadFile () angewendet.). LoadFile () wird also nicht unbedingt genau das sein, was Angefordert wurde. Wenn sich in Version 2 eine Assembly mit ihrer Identität im GAC befindet, wird stattdessen die GAC-Kopie .__ verwendet. Verwenden Sie ReflectionOnlyLoadFrom () , um genau das zu laden, was Sie möchten - aber, Beachten Sie, dass auf diese Weise geladene Assemblys nicht ausgeführt werden können.)

LoadFile () hat einen Haken. Seit es verwendet keinen Bindungskontext, es ist Abhängigkeiten werden nicht automatisch in seinem Verzeichnis gefunden. Wenn sie nicht im Load-Kontext verfügbar, können Sie müsste die .__ abonnieren. AssemblyResolve-Ereignis zum Binden von zu ihnen.

Siehe hier .

Siehe auch Einen Binding Context - Artikel im selben Blog auswählen.

56
CraigTP

Nach vielem Kopfkratzen habe ich heute Nachmittag selbst einen Unterschied entdeckt.

Ich wollte zur Laufzeit eine DLL laden, und die DLL lebte in einem anderen Verzeichnis. Dass DLL eigene Abhängigkeiten (DLLs) hatte, die auch in demselben Verzeichnis lebten.

LoadFile (): Die spezifische DLL wurde geladen, jedoch nicht die Abhängigkeiten. Wenn also der erste Aufruf von DLL an eine dieser anderen DLLs erfolgte, wurde eine FileNotFoundException ausgelöst.

LoadFrom (): Die von mir angegebene DLL und alle Abhängigkeiten in diesem Verzeichnis wurden geladen.

37
LordWilmore

ein Unterschied, den ich bemerkt habe, ist:

Assembly.LoadFile - Lädt Assembly in verschiedenen AppDomains mit eingeschränkten Benutzerrechten (Unterschiedsprinzip). Operationen wie Serilisation/Deserilisation konnten nicht durchgeführt werden.

Assembly.LoadFrom - Lädt Assembly in derselben AppDomain mit denselben Benutzerrechten (dasselbe Prinzip).

3
Lalit

Hinweis: Wenn eine Assembly über einen 8.3-Pfad und dann von einem Pfad außerhalb von 8.3 geladen wird, werden sie als unterschiedliche Assemblys angesehen, obwohl sie dieselbe physikalische DLL sind.

2
Gregg DeMasters

.NET hat einen anderen Ladekontext. Suzanne Cook schrieb hierüber: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx

Auf diese Weise stellt .NET die Quarantäne, dass Referenzen nicht miteinander vermischt werden.

1
Arthur

In meinem Fall musste ich einfach den ASP - Anwendungscache mit dem Namen C:\Windows\Microsoft.NET\Framework\[asp version]\Temporary ASP.NET Files löschen. Es wird neu erstellt, wenn die Site zum ersten Mal ausgeführt wird. Stoppen Sie zuerst IIS.

Hoffe, das hilft jemandem, wie er es für mich getan hat.

0
David Roth