Теневое копирование сборок

Теневое копирование позволяет обновлять используемые в домене приложения сборки без выгрузки домена приложения. Это особенно полезно для приложений, которые должны быть доступны постоянно, таких как сайты ASP.NET.

Внимание

Теневое копирование не поддерживается в приложениях Магазина Windows 8.x.

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

Если для домена приложения настроено теневое копирование файлов, сборки по пути приложения копируются в другое расположение и загружаются из него. Копия блокируется, но исходный файл сборки разблокирован, и его можно обновить.

Внимание

Единственными сборками, которые подлежат теневому копированию, являются сборки, хранящиеся в каталоге приложения или в его подкаталогах, указанных в свойствах ApplicationBase и PrivateBinPath при настройке домена приложения. Хранящиеся в глобальном кэше сборки не подлежат теневому копированию.

Эта статья состоит из следующих разделов:

  • Включение и использование теневого копирования — содержит описание основных принципов использования и параметров, доступных для теневого копирования.

  • Производительность при запуске — содержит описание изменений, внесенных в теневое копирование в .NET Framework 4 с целью улучшить производительность при запуске, а также способов возврата к поведению более ранних версий.

  • Устаревшие методы — содержит описание изменений, внесенных в свойства и методы, которые контролируют теневое копирование в .NET Framework 2.0.

Включение и использование теневого копирования

Чтобы настроить теневое копирование для домена приложения, можно использовать свойства класса AppDomainSetup.

  • Чтобы включить теневое копирование, присвойте свойству ShadowCopyFiles строковое значение "true".

    По умолчанию этот параметр вызывает копирование всех сборок по пути приложения в кэш загрузки перед их загрузкой. Это тот же кэш, который поддерживается средой CLR для хранения файлов, загруженных с других компьютеров. Среда CLR автоматически удаляет файлы, если они больше не требуются.

  • При необходимости задайте произвольное местоположение для теневой копии файлов с помощью свойств CachePath и ApplicationName.

    Базовый путь к расположению формируется путем присоединения свойства ApplicationName к свойству CachePath в качестве подкаталога. Сборки копируются в подкаталоги этого пути, а не в сам путь.

    Примечание.

    Если свойство ApplicationName не задано, то свойство CachePath игнорируется и используется кэш загрузки. Исключение не выдается.

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

    Существует несколько причин, по которым рекомендуется задать пользовательское расположение для теневой копии файлов. Это может потребоваться сделать, если приложение создает большое количество копий. Кэш загрузки ограничен по размеру, а не по времени существования, поэтому возможно, что среда CLR попытается удалить файл, который все еще используется. Также пользовательское расположение следует указывать, если пользователи приложения не имеют прав на запись в каталог, который среда CLR использует для кэша загрузки.

  • При необходимости можно ограничить сборки, подлежащие теневому копированию, с помощью свойства ShadowCopyDirectories.

    При включении теневого копирования для домена приложения по умолчанию будут копироваться все сборки из пути приложения, то есть из каталогов, указанных в свойствах ApplicationBase и PrivateBinPath. Вы можете ограничить копирование выбранных каталогов, создав строку, содержащую только те каталоги, теневые копии которых требуется создать, и присвоив эту строку свойству ShadowCopyDirectories. Для разделения каталогов используется точка с запятой. Единственными сборками, которые подлежат теневому копированию, являются сборки из выбранных каталогов.

    Примечание.

    Если не присвоить строку свойству ShadowCopyDirectories или присвоить ему значение null, выполняется теневое копирование всех сборок в каталогах, указанных в свойствах ApplicationBase и PrivateBinPath.

    Внимание

    Пути к каталогам не должны содержать точку с запятой, так как она является разделителем. Escape-символа для точки с запятой не существует.

Производительность при запуске

Когда запускается домен приложения, использующий теневое копирование, возникает задержка, пока сборки копируются из каталога приложения в каталог теневого копирования или проверяются, если они уже находятся в этом каталоге. До появления .NET Framework 4 все сборки копировались во временный каталог. Каждая сборка открывалась для проверки имени сборки и строгого имени. Каждая сборка проверялась на предмет того, обновлялась ли она позднее копии в каталоге теневого копирования. Если это было так, сборка копировалась в каталог теневого копирования. Наконец, временные копии удалялись.

Начиная с .NET Framework 4 при запуске по умолчанию происходит прямое сравнение даты и времени файла каждой сборки в каталоге приложения с датой и временем копии файла в каталоге теневого копирования. Если сборка была обновлена, она копируется с использованием той же процедуры, что и в более ранних версиях .NET Framework; в противном случае загружается копия из каталога теневого копирования.

Повышение итоговой производительности является наибольшим для приложений, сборки которых меняются нечасто, а изменения обычно появляются в небольшом подмножестве сборок. Если большинство сборок приложения меняется часто, новое поведение по умолчанию может явиться причиной снижения производительности. Вы можете восстановить поведение запуска предыдущих версий платформа .NET Framework, добавив элемент shadowCopyVerifyByTimestamp> в файл конфигурации сenabled="false".<

Устаревшие методы

Класс AppDomain имеет несколько методов, таких как SetShadowCopyFiles и ClearShadowCopyPath, которые можно использовать для управления теневым копированием в домене приложения, но они помечены как устаревшие в платформа .NET Framework версии 2.0. Рекомендуемый способ настройки теневого копирования для домена приложения — это использование свойств класса AppDomainSetup.

См. также