Frage

Ich habe mich nur gefragt, was passiert, wenn ich dieselben Montage -Bytes zweimal in einer Web -App laden wollte.

Zum Beispiel habe ich diesen Code

byte[] assem = System.IO.File.ReadAllBytes(appRoot + "/Plugins/Plugin.dll");

var loadedAssem = Assembly.Load(assem);

var plugin = loadedAssem.CreateInstance("Plugin.ThePlugin") as IPlugin;

Ich habe diesen Code ausgeführt und auf die erste Anfrage gehe ich davon aus, dass die Montage in RAM (oder die HTTP -Laufzeit -Appdomain?) Geladen wird, und dann kann ich Instanzen von allem erstellen, was dort ist.

Wenn ich diesen Code erneut ausführen würde, sagen Sie auf der zweiten Anfrage, was auf der ersten Anfrage mit der Montage passieren würde?

Wäre im RAM immer noch existiert? Wenn ja, wie unterscheidet es zwischen den beiden Baugruppen? Oder überschreibt es die zuvor deklarierenden Klassen?

Dies ist für mein Verständnis, wie ich es in PHP tue, nicht nur ein Fall von "Required_once".

War es hilfreich?

Lösung

Dadurch werden zwei unterschiedliche Kopien der Baugruppe geladen, von denen jeder aus Ihrer Anwendung verwendet werden kann. Die Typen in jeder Baugruppe sind unterschiedliche Typen und funktionieren nicht mit einem anderen. Wenn Sie beispielsweise ein Widget von Copy1 nehmen und versuchen, es an eine Methode zu übergeben, die ein Widget für Copy2 annimmt, führt dies zu einem Laufzeitfehler. Es ist nicht möglich, Baugruppen zu entladen, sobald sie auf diese Weise geladen wurden (dh in Ihre Haupt -Appdomain).


In Bezug auf die Instanziierung:

  • Wenn Sie Assembly.CreateInstance (wie in Ihrem Beitrag gezeigt) verwenden, wird dies aus der Montage -Instanz erstellt, mit der Sie den Anruf getätigt haben.
  • Wenn Sie einen Aktivator verwenden. Da beide geladenen Baugruppen in diesem Fall den gleichen Namen haben, werden die Regeln für die Auflösungsregelung der Montage verwendet, die, meiner Meinung nach standardmäßig, die erste Übereinstimmung bevorzugt (so dass die von Ihnen geladene Baugruppe zuerst.) Ich bin mir dessen nicht sicher. Sie können das haken Appdomain.AssemblyResolve Ereignis, um Ihre eigene Priorisierung bereitzustellen und Ihre am meisten geladene Baugruppe zu verwenden.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top