Правила блокировки сборки и когда полезна теневая копия?

из того, что я понял до сих пор, например, прочитав этот документ: 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) Когда блокировка сборки, т.е. когда теневое копирование является полезной функцией?

Заранее спасибо за помощь.

6
задан starblue 3 September 2010 в 06:22
поделиться