2009-08-10 7 views
13

Muszę zadzwonić do źle napisanych komponentów COM firm trzecich, które mają wycieki pamięci i używa Single Threaded Apartment [STA] w długim procesie.Czy AppDomain jest odpowiednikiem procesu dla kodu .NET?

Wiem, że oddzielny proces będzie dobrym sposobem na jego wdrożenie i mogę go ponownie uruchomić od czasu do czasu z długiego procesu.

Czy zamiast tego można użyć AppDomain? Czy w aplikacji AppDomain wątek STA jest oznaczony odpowiednio? Czy ma własną pamięć obiektów COM? Czy wyładowanie AppDomain jest równoznaczne z zabiciem procesu?

Odpowiedz

22

AppDomain nie zapewnia takie same stopień izolacji w procesie. W rzeczywistości, jeśli obawiasz się, że komponent trzeciej strony nie jest w dobrej formie, istnieje ryzyko, że usunie twoją aplikację .NET.

Nie można zwolnić elementu AppDomain, jeśli kod niezaikalizowany jest wykonywany w momencie rozładowywania, więc może być trudno kontrolować kod strony trzeciej w AppDomain. Zobacz http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx Nawet dla kodu zarządzanego AppDomain nie zapewnia solidnego rozwiązania sandbox. Na przykład. jeśli załadowany kod odrodzi jakiekolwiek wątki, spowoduje to usunięcie całego procesu w przypadku nieobsługiwanych wyjątków. To pytanie ma nieco więcej informacji: .NET - What's the best way to implement a "catch all exceptions handler".

O ile mi wiadomo, najlepszym rozwiązaniem do obsługi kodu takiego jak ten w aplikacji .NET jest implementacja własnego procesu hosta CLR, takiego jak IIS i SQL Server.

+0

+1. znacznie lepiej niż mój apptempt. :) –

0

AppDomain (domena aplikacji) to izolowane środowisko, w którym aplikacje są uruchamiane.

Pomagają zapewnić izolację, rozładunek i granice bezpieczeństwa dla wykonywanie kodu zarządzanego.

  • Użyj domen aplikacji, aby wyizolować zadania, które mogą spowodować proces. Jeśli stan AppDomain, który jest , wykonanie zadania staje się niestabilny, AppDomain może zostać rozładowany bez wpływu na proces procesu . Jest to ważne w przypadku, gdy proces musi być wykonywany przez długi czas bez ponownego uruchamiania. Użytkownik może używać domen aplikacji do izolowania zadań, które nie powinny udostępniać danych.

  • Jeśli zespół jest ładowany do domyślnej domeny aplikacji, nie można go wyjąć z pamięci podczas wykonywania procesu . Jeśli jednak użytkownik otworzy drugą domenę aplikacji na , a następnie załaduje i uruchomi zespół, wówczas zostanie on załadowany po zwolnieniu tej domeny aplikacji . Użyj tej techniki, aby zminimalizować działający zbiór długich procesów, który czasami używa dużych bibliotek DLL.

Wiele domen aplikacji może działać w jednym procesie: ; jednak istnieje nie korelacja jeden-do-jednego między domenami aplikacji i wątkami w domenie . Kilka wątków może należeć do pojedynczej domeny aplikacji , a podczas gdy dany wątek nie jest ograniczony do pojedynczej domeny aplikacji , wątek jest wykonywany w pojedynczej domenie aplikacji .

SO pytania, które mogą być interesujące:

nie będę wyznawać być ekspertem w dziedzinie AppDomains, ale jestem dość pewny, że wyciek z obiektu COM (tj. pamięć niezarządzana) nie zostanie zwolniony przez u ładowanie AppDomain.Być może ktoś bardziej obeznany z tym może komentować.

Jak Brian wskazał: „... w wersji .NET Framework 2.0 domena nie jest gwarantowana do rozładunku, ponieważ może nie być możliwe, aby zakończyć wykonywanie wątków.”

+2

A więc jaki sposób działania zalecasz Rohit? –

+0

@ spoon16: możesz dodać własną odpowiedź. ;) –

+0

Jestem ciekawa, jak brzmi odpowiedź. Nie mam teraz do zaoferowania. –