Pytanie Nie rozumiem domen aplikacji


.NET ma tę koncepcję Domen Aplikacji, która z tego, co rozumiem, może być wykorzystana do załadowania złożenia do pamięci. Zrobiłem kilka badań na temat domen aplikacji, a także udałem się do mojego lokalnego sklepu z książkami, aby uzyskać dodatkową wiedzę na ten temat, ale wydaje się to bardzo rzadkie.

Wszystko, co wiem, że mogę zrobić z Domenami Aplikacyjnymi, to ładować złożenia w pamięci i mogę je rozładować, kiedy chcę.

Jakie są inne możliwości, o których wspomniałem w Domenach aplikacji? Czy wątki respektują granice domen aplikacji? Czy są jakieś wady związane z ładowaniem Zespołów w różnych Domenach Aplikacji innych niż Główne Domeny Aplikacji poza wydajnością komunikacji?

Łącza do zasobów, które omawiają Domeny aplikacji, również byłyby dobre. Sprawdziłem już MSDN, który nie ma na ten temat zbyt wiele informacji.


76
2018-03-07 21:11


pochodzenie




Odpowiedzi:


AppDomains najlepiej zwizualizowane jako proces bardzo lekki.

Na proces .Net może być N AppDomains, ale ogólnie rzecz biorąc jest tylko jeden. Prawdziwą zaletą AppDomains jest zapewnienie granicy izolacji w ramach procesu. Obiekty mogą komunikować się ze sobą tylko przez granicę AppDomain poprzez zdalne lub serializowane.

Możliwe jest również uruchomienie 2 AppDomains na zupełnie różnych poziomach bezpieczeństwa w ramach procesu. Może to pozwolić na uruchomienie głównej aplikacji w pełnym zaufaniu podczas uruchamiania niezaufanych wtyczek na znacznie niższym poziomie zaufania.

Trudno jest powiedzieć "tak" lub "nie", czy dany wątek jest zgodny z AppDomain. Możliwe, że pojedynczy wątek znajduje się w N różnych AppDomains. Taka sytuacja jest możliwa, jeśli obiekt w jednej AppDomain wykonuje zdalne wywołanie obiektu w innym AppDomain. Wątek będzie musiał przejść między AppDomains, aby zakończyć.

Wadą AppDomains jest głównie złożoność. Remoting może zająć trochę czasu, aby zorientować się, a prawidłowe ustawienie AppDomain może być nietrywialnym procesem.

Możesz zajrzeć do dokumentacji MSDN na AppDomains. Trudno jest znaleźć samouczek, który je opisuje, ponieważ ma wiele złożonych funkcji. Zapewnia to dobry przegląd, który, jeśli nie odpowie bezpośrednio na twoje pytanie, przynajmniej wskaże cię we właściwym miejscu.

http://msdn.microsoft.com/en-us/library/cxk374d9.aspx

Ten dokument nie jest już obsługiwany, zapoznaj się z tym dla zaktualizowanej wersji: https://msdn.microsoft.com/en-us/library/2bh4z9hs(v=vs.110).aspx


98
2018-03-07 21:18



Głównym problemem jest to, że nie rozumiem zdolności, które uzyskuję, używając ich. Czytałem, że są lekkim procesem, ale wydaje się, że noszą coś więcej niż tylko to, a może brakuje mi czegoś, co mogłoby mnie później ugryźć. IE Zabieram więcej, niż potrzebuję. - Jeremy Edwards


Odpowiedź JaredPar jest dobra, z wyjątkiem tego, że nie zauważa raison d'etre w AppDomains - czyli możesz WYBRAĆ Zgromadzenie tylko przez rozładowanie jego AppDomain. Jeśli jesteś długo działającym procesem systemu operacyjnego i spodziewasz się załadować a następnie zwolnić z dowolnego powodu, potrzebujesz AppDomain. Prototypowym przykładem jest ASP.NET, który ładuje zespoły kodu aplikacji na żądanie, a następnie może je później wyładować, gdy aplikacje nie są już aktywnie używane.

Kosztem, który płacisz za możliwość rozładowania, jest ta niezależność - musisz komunikować się przez granicę AppDomain, Nie można wykonać prostego wywołania metody. Musisz zarządzać cyklem życia aplikacji AppDomain. Itp.

Jeśli potrzebujesz dynamicznie ładować Złożenia i nie musisz ich wyładowywać podczas życia pojedynczego procesu to prawdopodobnie nie rób tego musisz uruchomić wiele domen aplikacji. Dobrym przykładem może tu być bogata aplikacja obsługująca model wtyczki, w której wyszukuje zespoły wtyczek w katalogu "etc" i ładuje je wszystkie. Jeśli jednak model wtyczki wymaga wyładowania wtyczek ... dobrze.

Istnieją niespotykane scenariusze. Przypuśćmy, że chcesz załadować dwie różne wersje Zgromadzenia w tym samym czasie. Możesz natrafić na pułapki, jeśli nie segregujesz ich z AppDomains. Ale to będzie dość rzadkie.

Głównym scenariuszem uzasadniającym istnienie AppDomains jest długotrwały proces, który musi umożliwiać rozładowanie złożeń.

Oczywiście aplikacje mogą polegać na procesie systemu operacyjnego, gdy chcemy zwolnić zespół. Innymi słowy, możesz mieć 3 lub 4 współpracujące ze sobą procesy, każdy z własnym zbiorem Zespołów, a gdy chcesz zwolnić zespół, po prostu zamknij proces, który go obsługuje. Ale AppDomain oferuje do tego lepszy mechanizm, bez konieczności zatrzymywania / uruchamiania procesu lub komunikatów między procesami, który jest jeszcze cięższy niż opisane powyżej komunikaty Cross-AppDomain. Mam na myśli to, że nadal działa zdalnie, ale jest wolniejszy i zmienia kontekst.


90
2018-03-07 23:03



Po co używać słowa, jeśli uważasz, że musisz je zdefiniować? - BlueRaja - Danny Pflughoeft
Ponieważ fajnie jest używać francuskich słów w odpowiedzi na pytania dotyczące informatyki. - Cheeso
@ BlueRaja-DannyPflughoeft i pomaga kształcić ludzi, którzy mogą nie być zaznajomieni z powszechnie używanym terminem obcym, który doskonale obejmuje ideę, która jest znacznie bardziej niezdarnie zdefiniowana w języku angielskim. - Sam Holder
@SamHolder Link do artykułu w Wikipedii mówi, że tłumaczenie na język angielski jest "powodem istnienia". To nie wydaje mi się zbyt niezdarnie zdefiniowane. - Bognar
Dla moich pieniędzy jest to najlepsza odpowiedź, ponieważ "raison d'etre" nie jest jasno stwierdzone nigdzie na MSDN, o ile mogę znaleźć. - Dan Ling


Kilka rzeczy, które możesz zrobić dzięki AppDomains:

  • można go wyłączyć bez narażania stabilności programu.
  • Możesz załadować kod i przyznać mu mniej przywilejów niż własny proces (np. Twój proces działa w pełni zaufany, ale ładujesz kod w oddzielnym AppDomain, który nie może nawet utworzyć pliku na dysku.)
  • Możesz obsłużyć nieobsługiwane wyjątki aplikacji AppDomain bez konieczności zawieszania procesu.
  • Itp.

Mówiąc najprościej, jest to granica bezpieczeństwa i prawie granica procesu. Jeśli chodzi o wydajność, wiele AppDomains w ramach procesu nie stanowi znacznego obciążenia. Uruchomienie oddzielnego procesu zamiast AppDomain jest znacznie bardziej kosztowne.


27
2018-03-07 21:46