Поделиться через


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

Замечание

Эта статья связана с .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.

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

Это важно

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

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

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

Это важно

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

В этой статье содержатся следующие разделы:

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

Свойства класса 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.

См. также