Was ist eine .NET-Anwendungsdomäne?


82

Welche Auswirkungen hat das Ausführen von Code in zwei verschiedenen Anwendungsdomänen?

Wie werden Daten normalerweise über die Anwendungsdomänengrenze übertragen? Ist es dasselbe wie Daten über die Prozessgrenze zu übertragen? Ich bin neugierig, mehr über diese Abstraktion zu erfahren und wofür sie nützlich ist.

BEARBEITEN: Gute vorhandene Abdeckung der AppDomain-Klasse im Allgemeinen bei Ich verstehe Anwendungsdomänen nicht


3
Der erste Teil ist ein Duplikat von stackoverflow.com/questions/622516/i-dont-understand-appdomains . Möglicherweise sollte die Frage so bearbeitet werden, dass Daten übergeben werden.
John Saunders

Woops, habe das verpasst. Dies kann geschlossen werden.
Luke

Antworten:


77

Eine AppDomain bietet grundsätzlich einen isolierten Bereich, in dem Code innerhalb eines Prozesses ausgeführt wird.

Eine einfache Möglichkeit, sich das vorzustellen, ist fast wie ein leichter Prozess, der sich in Ihrem Hauptprozess befindet. Jede AppDomain befindet sich in einem Prozess in vollständiger Isolation, sodass Sie Code sicher ausführen können (er kann entladen werden, ohne den gesamten Prozess bei Bedarf herunterzufahren), mit separater Sicherheit usw.

Was Ihre Besonderheiten betrifft: Wenn Sie Code in zwei verschiedenen AppDomains innerhalb eines Prozesses ausführen, wird der Code isoliert ausgeführt. Jede Kommunikation zwischen den AppDomains wird entweder serialisiert oder über MarshallByRefObject abgewickelt. Es verhält sich in dieser Hinsicht sehr ähnlich wie Remoting. Dies bietet ein hohes Maß an Sicherheit - Sie können Code ausführen, dem Sie nicht vertrauen, und wenn etwas nicht stimmt, hat dies keine Auswirkungen auf Sie.

Die MSDN-Beschreibung der Anwendungsdomänen enthält viele weitere Details .


Können Sie klarstellen, was Sie unter "wenn etwas nicht stimmt" verstehen?
Luke

11
Ein Beispiel: Wenn Sie einen nicht behandelten Thread in einem Threadpool haben, wird die App-Domäne heruntergefahren. Normalerweise wird dadurch Ihr Prozess abgebrochen - was gefährlich ist, wenn Sie Benutzercode oder ein Plugin laden. Wenn Sie in einer separaten Appdomain arbeiten, können Sie dies viel besser handhaben. Wenn die zweite AppDomain abgerissen werden muss, können Sie dies tun, ohne Ihren Prozess zu beeinträchtigen.
Reed Copsey

20

Es ist eine Isolationsschicht, die von der .NET-Laufzeit bereitgestellt wird. Daher leben App-Domänen in einem Prozess (1 Prozess kann viele App-Domänen haben) und haben ihren eigenen virtuellen Adressraum.

App-Domains sind nützlich, weil:

  • Sie sind kostengünstiger als vollständige Prozesse
  • Sie sind Multithreading
  • Sie können einen stoppen, ohne dabei alles zu töten
  • Trennung von Ressourcen / config / etc.
  • Jede App-Domain wird auf ihrer eigenen Sicherheitsstufe ausgeführt

1

Wenn Sie es aus der Perspektive der prozessorinternen Details betrachten, wird ein anderer Wert für das CS-Register (Code Segment) festgelegt. Code und CS: IP-Register (Instruction Pointer) werden vom Prozessor ausgeführt.

(Ich habe mich aus Gründen der Kürze dafür entschieden, Diskussionen im Zusammenhang mit Seitentabellen zu überfliegen).

AppDomain markiert diese Grenze. für die Codesicherheit.

Der Grund für die Angabe dieses Hintergrunds besteht darin, Fragen dieser Art zu beantworten: 1. Wie können wir über zwei App-Domänen hinweg auf Ressourcen zugreifen (ja, mithilfe von Pipes oder anderen Freigabemechanismen, die nicht direkt als CS: IP gelten, kann nicht auf eine andere App-Domäne festgelegt werden? Es ist nur das Betriebssystem, das das kann. Nicht die CLR.

  1. Könnte es mehrere Threads in der App-Domäne geben. Technisch ja, da der CS-Wert im aktuellen Prozess sein wird. Sie können die IP-Adresse durch eine Sprunganweisung in eine andere ändern (Funktionsaufruf / Goto-Kombination).

  2. können zwei Threads in zwei verschiedenen App-Domänen kommunizieren (Nr. siehe Punkt 1.)

  3. können zwei Threads in einer einzelnen App-Domäne kommunizieren (Ja, siehe Punkt 2)

Einige andere Kombinationen dieser Fälle könnten durch wenig Wissen über die Funktionsweise von CS: IP beantwortet werden.


0

Jede Anwendung, die innerhalb eines Prozesses ausgeführt wird, AppDomain, ist auch ein leichter Prozess, oder wir können sagen, eine logische Einheit, die eine Gruppe von Baugruppen hat (dies ist ein Container, der eine Gruppe von Baugruppen enthält) und die innerhalb des Prozesses auf Isolationsebene desselben Prozesses vorhanden ist Auf diese Weise können mehrere Assemblys innerhalb desselben Prozesses ausgeführt und für den direkten Zugriff verhindert werden.

Ausführen einer Dot Net-Anwendung in AppDomain: Sobald eine Dot Net-Anwendung ausgeführt wurde, wurde die Shell des Betriebssystems in einen Prozess geladen und eine neue AppDomain im selben Prozess erstellt. Anschließend werden alle Assemblys in der erstellten AppDomain geladen, die jetzt aus dem AppDomain-Code ausgeführt werden.

Wann man eine benutzerdefinierte AppDomain erstellt: Wir können eine eigene AppDomain erstellen. In diesem Szenario können wir nun eine eigene AppDomain erstellen. Angenommen, zur Laufzeit müssen wir die Assemblys hinzufügen oder entfernen, ohne die laufende Anwendung zu unterbrechen. Dann können wir eine eigene AppDomain erstellen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.