2009-04-22 11 views
9

Gibt es eine AppDomain für jedes C# -Programm, auch wenn wir keine AppDomain erstellen? Warum ist es erforderlich? Ich habe gelesen, dass Drittanbieter-Assemblies die gesamte Anwendung abstürzen, wenn wir sie nicht in separate AppDomain laden. Ich habe diesen Punkt nicht gut verstanden. Kann mir jemand das auch erklären.Gibt es eine AppDomain für jedes C# -Programm?

Antwort

15

AppDomain ist so ziemlich wie ein Prozess, es ist eine Infrastruktur, in der Ihre Anwendung ausgeführt wird. Eine .NET-Assembly muss in einem AppDomain geladen werden, um ausgeführt zu werden. Es ist nicht erforderlich, Baugruppen von Drittanbietern in separaten AppDomains zu laden, aber wenn Sie dies tun, stellt es Isolierung zwischen ihnen (wie zwei separate Prozesse) und Fehlfunktion in einem wird sich nicht auf den anderen auswirken. Anwendungsdomänen können unabhängig voneinander entladen werden.

Als Beispiel verwendet SQL Server AppDomain s, um CLR-Assemblies sicher in seinem Prozess zu laden.

2

Jede Anwendung hat mindestens eine Anwendungsdomäne, ja.

Ich weiß nicht, was die Notiz über 3rd Party Assemblies bedeutet.

1

Es gibt mindestens eine AppDomain für jedes Programm, das Sie beliebig oft erstellen können, aber Sie werden selten mehr als eins benötigen.

Es ist im Grunde ein Container, in dem Code ausgeführt wird, der mit einer bestimmten Vertrauensstellung ausgeführt wird.

1

Es gibt eine Standard-App-Domäne, in die Ihre Anwendung geladen wird (jede Instanz erhält eine eigene).

Die Absturz-Sache bedeutet, dass eine Drittanbieter-Assembly (z. B. ein Plugin) die gesamte Anwendung abstürzt, wenn sie abstürzt, wenn Sie sie nicht in eine separate App-Domäne laden. Es empfiehlt sich daher, Plug-Ins in eine separate App-Domain zu laden, da ein Absturz in einer App-Domain nur zu dieser App-Domain und nicht zu den anderen Domains führt. Die CLR Add-In blog hat einige Beiträge dazu.

Eine wichtige Sache zu beachten ist, dass eine App-Domäne nicht notwendigerweise in demselben Prozess oder auf demselben System sein muss, so dass Sie es im Grunde für das Remoting benötigen.

3

ich über 3rd-Party-Baugruppen gelesen haben verursacht Absturz, wenn wir die Verwendung von AppDomain nicht

machen

Ich glaube, Sie sprechen über andere Baugruppen in getrennten Anwendungsdomänen geladen werden. Auf diese Weise können sie von Ihrem Adressraum isoliert werden, um einen Absturz ihres Codes zu verhindern, der Sie betrifft. Die Kosten liegen darin, dass das Kommunizieren mit einer Assembly in einer separaten App-Domäne schwieriger ist und zu einer Leistungseinbuße führt, da alle Anrufe über die Grenzen der App-Domäne hinweg martialisch geführt werden müssen.

Dies ist ein ziemlich fortgeschrittenes Thema, würde ich empfehlen, in Richter lesen (andere Bücher sind avaiable).

Verwandte Themen