Теневое копирование сборок
Теневое копирование позволяет обновлять используемые в домене приложения сборки без выгрузки домена приложения. Это особенно полезно для приложений, которые должны быть доступны постоянно, таких как узлы ASP.NET.
Среда 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. Для разделения каталогов используется точка с запятой. Единственными сборками, которые подлежат теневому копированию, являются сборки из выбранных каталогов.
Важно
Пути каталогов не могут содержать точку с запятой, так как она является символом-разделителем.Escape-символа для точки с запятой не существует.
Производительность при запуске
Когда запускается домен приложения, использующий теневое копирование, возникает задержка в каталоге приложения во время копирования сборок в каталог теневого копирования или во время проверки их наличия в этом расположении. До появления .NET Framework 4 все сборки копировались во временный каталог. Каждая сборка открывалась для проверки имени сборки и проверки строгого имени. Каждая сборка проверялась на наличие недавнего обновления по сравнению с копией в каталоге теневого копирования. Если это так, сборка копировалась в каталог теневой копии. Наконец, временные копии удаляются.
Начиная с .NET Framework 4, поведение при запуске по умолчанию — это прямое сравнение даты файла и времени каждой сборки в каталоге приложения с датой файла и временем копии в каталоге теневого копирования. Если сборка была обновлена, она копируется с использованием той же процедуры, что и в более ранних версиях .NET Framework; в противном случае загружается копия из каталога теневого копирования.
Улучшение результирующей производительности является наибольшим для приложений, в которых сборки часто не меняются, а изменения обычно появляются в малых подмножествах сборок. Если большинство сборок в приложении изменяется часто, новое поведение по умолчанию может явиться причиной снижения производительности. Можно восстановить поведение при запуске аналогично предыдущим версиям .NET Framework путем добавления элемента <shadowCopyVerifyByTimestamp> в файл конфигурации с логическим значением enabled="false".
Устаревшие методы
В классе AppDomain есть несколько методов, например SetShadowCopyFiles и ClearShadowCopyPath, которые можно использовать для управления теневым копированием в домене приложения, но в платформе .NET Framework версии 2.0 они были помечены как устаревшие. Рекомендуемый способ настройки теневого копирования для домена приложения — это использование свойств класса AppDomainSetup.
См. также
Ссылки
AppDomainSetup.ShadowCopyFiles
AppDomainSetup.ApplicationName
AppDomainSetup.ShadowCopyDirectories