Co to jest domena aplikacji .NET?


84

W szczególności, jakie są konsekwencje uruchamiania kodu w dwóch różnych domenach aplikacji?

W jaki sposób dane są zwykle przekazywane przez granicę domeny aplikacji? Czy to to samo, co przekazywanie danych przez granicę procesu? Ciekaw jestem, aby dowiedzieć się więcej o tej abstrakcji i do czego jest przydatna.

EDYCJA: Dobre istniejące pokrycie klasy AppDomain w ogóle pod adresem Nie rozumiem domen aplikacji


3
Pierwsza część to duplikat stackoverflow.com/questions/622516/i-dont-understand-appdomains . Może pytanie powinno zostać zredagowane tak, aby dotyczyło przekazywania danych.
John Saunders,

Ups, przegapiłem to. Można to zamknąć.
Luke,

Odpowiedzi:


80

AppDomain zasadzie dostarcza izolowany obszar, w którym kod jest uruchamiany wewnątrz procesu.

Łatwy sposób myślenia o tym jest prawie jak lżejszy proces znajdujący się w głównym procesie. Każda AppDomain istnieje w ramach procesu w całkowitej izolacji, co pozwala na bezpieczne uruchamianie kodu (w razie potrzeby można go rozładować bez niszczenia całego procesu), z oddzielnymi zabezpieczeniami itp.

Jeśli chodzi o specyfikę - jeśli uruchomisz kod w 2 różnych domenach AppDomains w ramach procesu, kod będzie działał w izolacji. Wszelka komunikacja między domenami AppDomains będzie serializowana lub obsługiwana za pośrednictwem MarshallByRefObject. Pod tym względem zachowuje się bardzo podobnie do korzystania z usług zdalnych. Zapewnia to ogromne bezpieczeństwo - możesz uruchomić kod, któremu nie ufasz, a jeśli zrobi coś źle, nie wpłynie to na Ciebie.

Więcej szczegółów można znaleźć w opisie domen aplikacji w witrynie MSDN .


Czy możesz wyjaśnić, co masz na myśli, mówiąc „jeśli powoduje coś złego”?
Luke,

12
Jeden przykład: jeśli masz nieobsługiwany wątek w puli wątków, spowoduje to zniszczenie domeny aplikacji. Zwykle zabije to twój proces - co jest niebezpieczne, jeśli ładujesz kod użytkownika lub wtyczkę. Uruchomienie w osobnej domenie aplikacji oznacza, że ​​możesz sobie z tym poradzić znacznie lepiej - jeśli musisz zburzyć drugą domenę AppDomain, możesz sobie z tym poradzić bez przerywania procesu.
Reed Copsey,

21

Jest to warstwa izolacyjna zapewniana przez środowisko uruchomieniowe .NET. W związku z tym domeny aplikacji znajdują się w procesie (1 proces może mieć wiele domen aplikacji) i ma własną wirtualną przestrzeń adresową.

Domeny aplikacji są przydatne, ponieważ:

  • Są tańsze niż pełne procesy
  • Są wielowątkowe
  • Możesz go zatrzymać bez zabijania wszystkiego w tym procesie
  • Segregacja zasobów / config / etc
  • Każda domena aplikacji działa na własnym poziomie zabezpieczeń

1

Jeśli spojrzysz na to z perspektywy wewnętrznych szczegółów procesora, ustawia on inną wartość dla rejestru segmentu kodu (CS). code i rejestr CS: IP (Instruction Pointer) jest tym, który jest wykonywany przez procesor.

(Zdecydowałem się przejrzeć dyskusję związaną z tabelą stron dla zwięzłości).

AppDomain wyznacza tę granicę. dla bezpieczeństwa kodu.

Powodem podania tego tła jest uciec od pytań tego rodzaju: 1. w jaki sposób możemy uzyskać dostęp do zasobów w dwóch domenach aplikacji (tak, używając potoków lub innych mechanizmów udostępniania nie bezpośrednio, ponieważ CS: IP nie można ustawić na inną domenę aplikacji). To tylko system operacyjny może to zrobić, a nie CLR)

  1. Czy w domenie aplikacji może być wiele wątków? Technicznie tak, ponieważ wartość CS będzie w obecnym procesie. możesz zmienić adres IP na inny za pomocą instrukcji skoku (połączenie funkcji wywołanie / goto)

  2. czy dwa wątki w dwóch różnych domenach aplikacji mogą się komunikować (patrz punkt 1.)

  3. czy dwa wątki w jednej domenie aplikacji mogą się komunikować (tak, patrz punkt 2)

na kilka innych kombinacji tych przypadków można odpowiedzieć niewielką wiedzą na temat działania CS: IP.


0

Każda aplikacja działająca w ramach procesu, AppDomain jest również procesem lekkim lub możemy powiedzieć jednostkę logiczną, która ma grupę zestawów (jest to kontener zawierający grupę zestawów) i istnieje wewnątrz procesu na poziomie izolacji tego samego procesu , umożliwia to uruchamianie wielu zestawów w ramach tego samego procesu i uniemożliwia bezpośredni dostęp do nich.

Uruchamianie aplikacji Dot Net w domenie AppDomain: Po uruchomieniu dowolnej aplikacji dot net powłoka systemu operacyjnego ładuje środowisko CLR do procesu, a nowa domena AppDomain jest tworzona w tym samym procesie i ładuje wszystkie zestawy w utworzonej domenie AppDomain, teraz z kodu AppDomain zostanie wykonany.

Kiedy niestandardowa domena AppDomain: Możemy stworzyć własną domenę AppDomain, teraz chodzi o scenariusz, w którym możemy stworzyć własną domenę AppDomain. Załóżmy, że w czasie wykonywania musimy dodawać lub usuwać zestawy bez przerywania działającej aplikacji, a następnie możemy utworzyć własną domenę AppDomain.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.