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.
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
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