Laden...

AppDomain erstellen und Assembly (Dll) in ASP starten

Erstellt von Kingside vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.524 Views
K
Kingside Themenstarter:in
60 Beiträge seit 2014
vor 5 Jahren
AppDomain erstellen und Assembly (Dll) in ASP starten

Hallo,

ich muss sagen das Thema ist zu mindestens für mich sehr komplex.
Nun was ich möchte ist, eine Methode aus einer Dll, aus einer ASP Anwendung starten.

Dazu hätte ich die Möglichkeit, diese mit diesen wenigen Zeilen Code auszuführen:

Assembly assembly = Assembly.LoadFile(trustedCodeRequest.FilePath);

                var type = assembly.GetType("Kingside.TrustedCode.Program");

                dynamic instance = Activator.CreateInstance(type);

                MethodInfo main = type.GetMethod("Main");

                main.Invoke(instance, new object[] { trustedCodeRequest.Parameter });

Das funktioniert auch wunderbar.
Das Problem an der Sache, die Dll wurde von der AppDomain, von der ich das aus starte geladen und kann daher nicht überschrieben werden, solange die AppDomain existiert.

Die Lösung wäre, für den Aufruf eine eigene AppDomain zu erstellen, dort die Assembly zu starten und die AppDomain wieder zu entfernen.

Dazu habe ich mir das Beispielprojekt aus diesem Blog geschnappt:
https://www.brad-smith.info/blog/archives/500

In einer Konsolenanwendung funktioniert das Beispiel wunderbar, da die Konsole selbst ein Prozess ist und weitere AppDomains erzeugen kann.

Bei ASP sieht es etwas anders aus. Da ist jede Application im IIS eine AppDomain.
Somit bekomme ich dort eine File not found Exception, wenn ich versuche die Assembly zu starten.

Könnte mir bitte jemand auf die Sprünge helfen?

16.807 Beiträge seit 2008
vor 5 Jahren

Was ist das für eine DLL und wieso referenzierst Du sie nicht einfach? Geheimnisse über Geheimnisse.
Muss sie nachträglich geladen werden? Das versucht man bei ASP.NET zu vermeiden.

FileNotFound hat aber prinzipiell nichts mit der AppDomain zutun.

K
Kingside Themenstarter:in
60 Beiträge seit 2014
vor 5 Jahren

Genau genommen ist es eine DLL, die ich selbst kompilieren lasse.
Diese kann sich zur Laufzeit ändern. Daher ist ein einfaches referenzieren leider nicht möglich.
Ich glaube schon, dass es etwas mit der AppDomain zu tun hat. Schließlich hat jede geladene Assembly einen Pfad, wo sie die Referenzen sucht. Was ich aber auch nicht verstehe, ist, dass ich ihm einen Absoluten Pfad zur DLL mitgebe.

16.807 Beiträge seit 2008
vor 5 Jahren

Schließlich hat jede geladene Assembly einen Pfad, wo sie die Referenzen sucht.

Wenn eine Assembly weitere Assemblies benötigt, dann kann das ein FileNotFound auslösen, die man mit Hilde des Dependency Walkers anaylisieren kann. Damit löst man also mal das Kernproblem des Threads.
Aber auch das hat prinzipiell nichts mit der AppDomain zutun, sondern mit der Tatsache, wie Assemblies geladen werden.

Was versuchst Du da zu "basteln" ? Ein Pluginsystem?
Wenn Du sagst, was Du da versuchst zu bauen, kann man Dir evtl. etablierte Lösungen vorschlagen.

Woher Du die Aussage

Bei ASP sieht es etwas anders aus. Da ist jede Application im IIS eine AppDomain.

nimmst, das ist mir ein Rätsel. Denn das stimmt so nicht.
Jeder Win32 Prozess kann mehrere AppDomains haben - im .NET Framework jedoch auch mindestens eine (die default).
Die Grundidee ist, dass ein und der selbe Prozess nämlich mehrere AppDomains enthalten kann, die jedoch vollständig isoliert sind.

Trotzdem versucht man das auch im IIS Grundlegend zu vermeiden, in dem man im IIS jede Applikation einen eigenen AppPool gibt und nicht mehrere Win32 Prozesse pro AppPool startet.
Es gibt hier in ASP.NET keine grundlegende Einschränkung für AppDomains - im Gegenteil: das AppDomain Konzept in .NET hat in ASP.NET seinen Ursprung; aber das Konzept wurde mittlerweile verworfen und findet so in .NET Core auch keine Anwendung mehr.

K
Kingside Themenstarter:in
60 Beiträge seit 2014
vor 5 Jahren

Danke für die späte Antwort.

Es ist eine Art Plugin System, ja. Also ich lasse zum Zeitpunkt X eine Dll aus einem C# Codesnippet generieren und zum Zeitpunkt Y will ich diese Methode aufrufen.
Mit Übergabeparameter zu der Methode und diese gibt mir wiederum etwas zurück.

Umgesetzt ist es so, dass man eine Master Klasse (DLL) hat. Das Plugin erbt von dieser Master Klasse und der Aufrufer kennt diese auch über eine Referenz.
Was ich mir gut vorstellen kann, ist, dass das Plugin die Master Klasse nicht findet. Obwohl sie im selben Verzeichnis liegt

Meine Anwendung ist eine ASP.NET Anwendung, keine Core.
Wenn du eine Alternativen Vorschlag hast, wie man so ein Plugin System aufbaut, wäre ich auch hierfür bereit.
Ich dachte nur, dass eine AppDomain nur Vorteile hat. Es ist performant, da kein eigener Prozess erzeugt wird, es ist isoliert kann kann schnell entladen werden.

Wenn ich falsche Aussagen treffe, dann bitte ich zu Entschuldigen 🙂