Правила блокировки сборки и когда полезно теневое копирование? - PullRequest
6 голосов
/ 02 сентября 2010

из того, что я понял до сих пор, прочитав этот документ, например: 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, но, похоже, она вообще не заблокирована: IМожно даже удалить его!

Так вот мои вопросы:

1) Почему в этом примере загруженная сборка не заблокирована?

2) Когда блокировка сборки, т. Е. Когда теневое копирование является полезной функцией?

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

1 Ответ

4 голосов
/ 28 апреля 2011

Теневые копии полезны при перезапуске домена приложения. Например, Предположим, ваша программа запускает набор плагинов, используя собственные домены приложений, и в фоновом режиме вы загружаете обновленную версию. Если домен приложения запущен с использованием теневого копирования, то ваша библиотека реализации плагина может быть обновлена, и вы можете перезагрузить плагин, и новая версия получит перезапуск приложения.

...