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
Odpowiedzi:
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 .
źródło
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ż:
źródło
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)
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)
czy dwa wątki w dwóch różnych domenach aplikacji mogą się komunikować (patrz punkt 1.)
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.
źródło
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.
źródło