Verwendung von AppDomain in C #


Antworten:


79

Die wichtigste Verwendung ist, dass Ihr Code einen haben muss - dh alles, was Sie in C # schreiben, wird in einem ausgeführt AppDomain. Das ist ziemlich wichtig ;-p

Wenn Sie zusätzliche App-Domains meinen :

Wenn Sie Plugins und anderen nicht vertrauenswürdigen Code verwenden, können Sie diese sowohl isolieren als auch entladen (Sie können keine Assemblys entladen - nur ganze App-Domänen).

Ich verwende es derzeit, um dynamisch generierte DLLs zu laden, damit ich sie entladen kann.

Sie können auch verschiedene Konfigurationsdateien, Vertrauensstufen usw. festlegen, sind jedoch mit Kosten für Komplexität und Remoting verbunden.

MSDN hat einen Abschnitt über App-Domains, hier .


30

Ich kann Ihnen nicht sagen, was die wichtigste Verwendung ist, da dies von der Situation abhängt.

AppDomains sind nützlich, um Teile Ihrer Anwendung zu sandboxen. Sie können Erweiterungen in eine AppDomain laden und erneut entladen - etwas, das Sie sonst nicht tun können. Sie können AppDomains bestimmte Rechte zuweisen. Standardmäßig können Objekte in verschiedenen AppDomains nicht aufeinander zugreifen.

AppDomains können als einfache Prozesse angesehen werden, da sie Ihnen viele der gleichen Funktionen bieten. Im Gegensatz zu einem Prozess haben neue AppDomains jedoch standardmäßig keinen eigenen Thread. Sie müssen AppDomains und Threads selbst verwalten.

Außerdem teilen sich AppDomains alle denselben verwalteten Heap. Dies ist normalerweise kein Problem, kann jedoch überraschende Auswirkungen haben, da einige Instanzen wie Zeichenfolgen von AppDomains gemeinsam genutzt werden. Bei regelmäßiger Verwendung ist dies kein Problem. Wenn Sie jedoch Zeichenfolgen zum Sperren verwenden, können sich Threads in verschiedenen AppDomains gegenseitig beeinflussen.


2
Netter Hinweis zu Streichern.
AgentFire

2
"AppDomains verwenden alle denselben verwalteten Heap." Bedeutet das, dass sie auch statische Klassen oder statische Methoden gemeinsam nutzen?
Mathematik

22

Im Allgemeinen ist es nicht so alltäglich, AppDomains zu verwenden. Dies könnte als fortgeschrittenes Konzept angesehen werden. Ausgehend von dieser einfachen Sache ist es jedoch wichtig, die Konzepte hinter dem Wort "AppDomain" besser zu verstehen.

In Bezug auf die Architektur und so einfach wie möglich ist eine AppDomain ein Isolationscontainer, selbst in Bezug auf die Speicheradressierung. In ihr werden alle von einer Anwendung benötigten Assemblys geladen und ausgeführt, auch wenn dieses Konzept im Detail komplizierter zu erklären ist (Ich hoffe, es geht nicht um Ihre Frage, so tiefer zu gehen).

Von dort aus wird zunächst die AppDomain-Klasse verwendet, um Zugriff auf die anwendungsbezogene ausführende Anwendungsdomäne zu erhalten. Dies kann über die Implementierung der Singleton-Eigenschaft erfolgen AppDomain.CurrentDomain. Auf diese Weise ist es möglich:

  1. Zugriff auf die geladenen Baugruppen erhalten;
  2. Zugriff auf die von der Appdomain gemeinsam genutzten Datensteckplätze erhalten;
  3. Intems-Marshalling in Bezug auf das Entpacken erstellter Instanzen aus geladenen Assemblys in erstellten Domänen.

Dann wird die AppDomain-Klasse verwendet, um:

  1. Erstellen Sie im selben Prozess weitere "Domänen".
  2. Ausführen von Baugruppen im Prozess;
  3. Verwalten des Lade- / Entladevorgangs der Appdomain.

Es kann nützlich sein, sich den Code des neuen Microsoft-Frameworks (noch nicht veröffentlicht) MEF (Managed Extesibility Framework) anzusehen, das wirklich auf Konzepten wie AppDomains-Kreationen und dem Entladen dynamisch geladener Assemblys basiert.

Als einfaches Beispiel für Dinge und Beispiele dafür, was Sie mit AppDomains tun können, kann ich diesen Link teilen .

Ich hoffe ich habe deine Frage beantwortet.


9

AC # AppDomain ist ein logisch isolierter Container, in dem .NET-Code ausgeführt wird. Wenn Sie einen .NET-Code ausführen, wird dieser immer in einer Standard-Appdomain ausgeführt.

Sehen Sie sich dieses 30-minütige Youtube-Video an. Was ist C # AppDomain? Dies erklärt AppDomain ausführlicher.

C # Appdomain

Aber lassen Sie mich noch versuchen, es genauer zu erklären. Nehmen wir an, Sie erhalten eine DLL eines Drittanbieters und möchten diese in Ihrer Anwendung verwenden. Sie vermuten jedoch auch, dass der Drittanbieter über schädlichen Code verfügen kann, sodass Sie die DLL des Drittanbieters in einer eingeschränkten Umgebung ausführen möchten. Als ob Sie nicht möchten, dass der Dritte auf Ihr Laufwerk c: zugreift oder Dateien löscht und so weiter.

Sie können also zwei AppDomains erstellen, eine für Dritte und eine für Ihre eigenen C # -Klassen. Für die Appdomain eines Drittanbieters wenden Sie Sicherheitsbeschränkungen an, die nicht auf Laufwerk c: zugreifen können, und für Ihre C # -DLLs verfügen Sie über eine uneingeschränkte App-Domain.


2

Bitte lesen Sie meinen Blog für die Standardanwendung des Laufzeitladens von DLLs und der gegenseitigen Kommunikation mit AppDomain. https://blog.vcillusion.co.in/sending-events-through-application-domain-boundary/

  1. Laufzeit Laden und Entladen von DLLs : Ich habe an einem Projekt gearbeitet, bei dem DLLs zur Laufzeit vom Benutzer geladen werden. Während der Programmausführung werden die Methoden mit Reflection ausgeführt und während des Programmlaufs entladen.
  2. Sichern meines Hauptausführungsprogramms : Wir laden die DLL dynamisch, sodass jede Ausnahme, die in dieser dynamisch geladenen DLL auftrat, meine Haupt-AppDomain nicht beeinträchtigte. Im Falle von Korruptionsszenarien haben wir die Möglichkeit, die DLL effizient zu entladen und erneut zu laden.
  3. AppDomain-übergreifende Kommunikation : Wir können zwei beliebige DLLs zur Laufzeit dynamisch in verschiedene AppDomain-Dateien laden und sie miteinander kommunizieren lassen.
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.