из того, что я понял до сих пор, например, прочитав этот документ: http://msdn.microsoft.com/en-us/library/ms404279.aspx , Теневое копирование - это функция, которая позволяет использовать сборка при загрузке в данный момент приложением.
Из вышеупомянутого документа:
Среда исполнения на языке блокирует файл сборки при загрузке сборки, поэтому файл не может быть обновлен, пока сборка не выгружена. Единственный способ выгрузить сборку из домена приложения - выгрузить домен приложения, поэтому при нормальных обстоятельствах сборка не может быть обновлена на диске до тех пор, пока не будут выгружены все использующие ее домены приложений.
Из вышеприведенного документа:
Среда выполнения на общем языке блокирует файл сборки при загрузке сборки, поэтому файл нельзя обновить до тех пор, пока сборка не будет выгружена. Единственный способ выгрузить сборку из домена приложения - выгрузить домен приложения, поэтому при нормальных обстоятельствах сборка не может быть обновлена на диске до тех пор, пока не будут выгружены все использующие ее домены приложений.
Из вышеприведенного документа:
Среда выполнения на общем языке блокирует файл сборки при загрузке сборки, поэтому файл нельзя обновить до тех пор, пока сборка не будет выгружена. Единственный способ выгрузить сборку из домена приложения - выгрузить домен приложения, поэтому при нормальных обстоятельствах сборка не может быть обновлена на диске до тех пор, пока не будут выгружены все использующие ее домены приложений. Когда домен приложения настроен для теневого копирования файлов, сборки из пути приложения копируются в другое место и загружаются из этого места. Копия заблокирована, но исходный файл сборки разблокирован и может быть обновлен.
Но иногда кажется, что загруженная сборка не заблокирована, и поэтому теневая копия бесполезна.
Для иллюстрации этого Я создал простую библиотеку A.dll с этим кодом:
using System; public class A { public A() { Console.WriteLine("A"); } }
Затем я загружаю ее в домен приложений с кодом, подобным следующему:
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"); } }
Поэтому я ожидал, что пока программа висит на ReadLine Я не должен иметь возможность использовать сборку A.dll, но похоже, что она вообще не заблокирована: я даже могу удалить ее!
Итак, вот мои вопросы:
1) Почему в этом примере загруженная сборка не заблокирована?
2) Когда блокировка сборки, т.е. когда теневое копирование является полезной функцией?
Заранее спасибо за помощь.