2010-09-01 9 views
6

z tego, co do tej pory zrozumiałem, czytając ten dokument na przykład: http://msdn.microsoft.com/en-us/library/ms404279.aspx, Kopia w tle to funkcja umożliwiająca użycie złożenia, gdy jest aktualnie ładowana przez aplikację.Zasady blokowania zespołu i kiedy kopiowanie w tle jest przydatne?

Z powyższego dokumentu:

plików wykonywalnych języka wspólnego blokuje pliku zespołu, gdy zespół jest załadowany, więc plik nie może być aktualizowana, dopóki zespół jest rozładowany. Jedynym sposobem na zwolnienie zespołu z domeny aplikacji jest rozładowanie domeny aplikacji, więc w normalnych okolicznościach nie można zaktualizować zespołu na dysku, dopóki wszystkie domeny aplikacji, które go używają, nie zostaną załadowane. Po skonfigurowaniu domeny aplikacji do kopiowania plików w tle, zespoły ze ścieżki aplikacji są kopiowane do innej lokalizacji i ładowane z tej lokalizacji. Kopia jest zablokowana, ale oryginalny plik zespołu jest odblokowany i może być aktualizowany.

Ale wydaje się, że czasami załadowany montaż nie jest zablokowana i tak Shadow Copy jest bezużyteczny.

Aby zilustrować ten punkt Został utworzony prosty biblioteka, A.dll, z tym kodem:

using System; 

public class A 
{ 
public A() 
{ 
    Console.WriteLine("A"); 
} 
} 

Następnie załadować go do AppDomain z kodem jak poniżej:

using System; 
using System.Reflection; 

class Test 
{ 
static void Main() 
{ 
    AppDomainSetup configuration = new AppDomainSetup 
    { 
    ShadowCopyFiles = "false" 
    }; 

    AppDomain appDomain = AppDomain.CreateDomain("", null, configuration); 

    Console.WriteLine(appDomain.ShadowCopyFiles); 

    Assembly assembly = appDomain.Load("A"); 
    assembly.CreateInstance("A"); 

    Console.ReadLine(); 

    assembly.CreateInstance("A"); 
} 
} 

Tak więc oczekiwałem, że podczas gdy program będzie zawieszony na ReadLine, nie powinienem móc używać zestawu A.dll, ale wygląda na to, że nie jest on w ogóle zamknięty: mogę go nawet usunąć!

Więc oto moje pytania:

1) Dlaczego w tej próbce załadowany montaż nie jest zablokowany?

2) Kiedy zespół jest zablokowany, tzn. Czy funkcja kopiowania w tle jest przydatna?

Z góry dziękuję za pomoc.

+1

Wypróbowałem twój kod i działa zgodnie z oczekiwaniami - zespół jest zablokowany i nie można go usunąć, dopóki program testowy nie istnieje. – Mormegil

+0

Hum, interesujące, więc wydaje się, że zachowanie nie jest deterministyczne i może się różnić w różnych kontekstach. To jest dość mylące. – Pragmateek

Odpowiedz

4

Kopie w tle są przydatne, gdy domena aplikacji jest ponownie uruchamiana. Na przykład Załóżmy, że Twój program uruchamia zestaw wtyczek używających własnych domen aplikacji, a w tle możesz pobrać zaktualizowaną wersję. Jeśli domena aplikacji została uruchomiona przy użyciu kopii w tle, można zaktualizować bibliotekę DLL wtyczki i można ponownie załadować wtyczkę, a nowa wersja zostanie pobrana przez ponowne uruchomienie aplikacji.

+0

Dziękuję za ten przykład, który jest doskonałą ilustracją przydatności kopiowania w tle. Ale powód, dla którego próbka działała w taki sposób, pozostaje tajemnicą. – Pragmateek

Powiązane problemy