NET ma taką koncepcję domen aplikacji, które z tego, co rozumiem, mogą być używane do ładowania zestawu do pamięci. Zrobiłem kilka badań na temat domen aplikacji, a także poszedłem do mojej lokalnej księgarni, aby uzyskać dodatkową wiedzę na ten temat, ale wydaje się ona bardzo ograniczona.
Wszystko, co wiem, że mogę zrobić z domenami aplikacji, to ładować zestawy do pamięci i mogę je zwolnić, kiedy chcę.
Jakie są inne możliwości domen aplikacji, o których wspomniałem? Czy wątki respektują granice domen aplikacji? Czy są jakieś wady ładowania zestawów w różnych domenach aplikacji innych niż główne domeny aplikacji poza wydajnością komunikacji?
Przydałyby się również linki do zasobów omawiających domeny aplikacji. Sprawdziłem już MSDN, które nie zawiera zbyt wielu informacji na ich temat.
Odpowiedź JaredPara jest dobra, z wyjątkiem tego, że nie zauważa racji bytu dla AppDomains - czyli tego, że można WYŁADOWAĆ zestaw tylko poprzez wyładowanie jego AppDomain. Jeśli jesteś długotrwałym procesem systemu operacyjnego i spodziewasz się, że będziesz musiał załadować, a następnie zwolnić zestawy z dowolnego powodu, potrzebujesz AppDomain. Prototypowym przykładem jest tutaj ASP.NET, który ładuje zestawy kodu aplikacji na żądanie, a następnie może je zwolnić później, gdy aplikacje nie są już aktywnie używane.
Koszt, który płacisz za możliwość wyładowania, to niezależność - musisz komunikować się przez granicę AppDomain, nie można wykonać prostego wywołania metody. Musisz zarządzać cyklem życia AppDomain. Itp.
Jeśli potrzebujesz tylko dynamicznie ładować zestawy i nie sądzisz, że będziesz musiał je wyładowywać w trakcie trwania pojedynczego procesu , prawdopodobnie nie musisz uruchamiać wielu AppDomains. Dobrym przykładem może być tutaj rozbudowana aplikacja, która obsługuje model wtyczek, w której wyszukuje zestawy wtyczek w katalogu „etc” i ładuje je wszystkie. Jeśli jednak model wtyczki wymaga wyładowania wtyczek ... cóż.
Istnieją scenariusze zewnętrzne. Przypuśćmy, że chcesz załadować 2 różne wersje zestawu w tym samym czasie. Możesz napotkać pułapki, jeśli nie oddzielisz ich za pomocą AppDomains. Ale to będzie dość rzadkie.
Podstawowy scenariusz, który uzasadnia istnienie AppDomains, to długotrwały proces, który musi mieć możliwość zwalniania zestawów.
Oczywiście aplikacje mogą polegać na procesie systemu operacyjnego, gdy chcesz zwolnić zestaw. Innymi słowy, możesz mieć uruchomione 3 lub 4 współpracujące procesy, każdy z własnym zestawem zestawów, a gdy chcesz zwolnić zestaw, po prostu zamknij proces, który obsługuje ten zestaw. Ale AppDomain oferuje mechanizm o wyższej wydajności, który to robi, bez konieczności zatrzymywania / uruchamiania procesu lub komunikacji między procesami, co jest jeszcze cięższe niż opisane wcześniej komunikaty cross-AppDomain. Chodzi mi o to, że nadal jest zdalny, ale jest wolniejszy i bardziej przełącza kontekst.
źródło
Niektóre rzeczy, które możesz zrobić z AppDomains:
Mówiąc najprościej, jest to granica bezpieczeństwa i prawie granica procesu. Jeśli chodzi o wydajność, wiele domen AppDomains w ramach procesu nie stanowi znaczącego obciążenia. Uruchomienie oddzielnego procesu zamiast domeny AppDomain jest znacznie bardziej kosztowne.
źródło