myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » AppDomain erstellen und Assembly (Dll) in ASP starten
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

AppDomain erstellen und Assembly (Dll) in ASP starten

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Kingside Kingside ist männlich
myCSharp.de-Mitglied

Dabei seit: 31.05.2014
Beiträge: 60


Kingside ist offline

AppDomain erstellen und Assembly (Dll) in ASP starten

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
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?
18.10.2018 23:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.835
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
18.10.2018 23:20 Beiträge des Benutzers | zu Buddylist hinzufügen
Kingside Kingside ist männlich
myCSharp.de-Mitglied

Dabei seit: 31.05.2014
Beiträge: 60

Themenstarter Thema begonnen von Kingside

Kingside ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
18.10.2018 23:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.835
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Kingside:
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

Zitat:
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.
19.10.2018 00:01 Beiträge des Benutzers | zu Buddylist hinzufügen
Kingside Kingside ist männlich
myCSharp.de-Mitglied

Dabei seit: 31.05.2014
Beiträge: 60

Themenstarter Thema begonnen von Kingside

Kingside ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 :-)
19.10.2018 00:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Jahr.
Der letzte Beitrag ist älter als ein Jahr.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 05.06.2020 03:51