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

Теневое копирование позволяет обновлять используемые в домене приложения сборки без выгрузки домена приложения.Shadow copying enables assemblies that are used in an application domain to be updated without unloading the application domain. Это особенно полезно для приложений, которые должны быть доступны постоянно, таких как сайты ASP.NET.This is particularly useful for applications that must be available continuously, such as ASP.NET sites.

Важно!

Теневое копирование не поддерживается в приложениях Магазин Windows 8.xWindows 8.x Store.Shadow copying is not supported in Магазин Windows 8.xWindows 8.x Store apps.

При загрузке сборки среда CLR блокирует ее файл, поэтому его нельзя обновить до тех пор, пока сборка не выгружена.The common language runtime locks an assembly file when the assembly is loaded, so the file cannot be updated until the assembly is unloaded. Единственный способ выгрузить сборку из домена приложения — выгрузить сам домен. Таким образом, в обычных условиях сборку нельзя обновить на диске до тех пор, пока не выгружены все домены приложений, использующие ее.The only way to unload an assembly from an application domain is by unloading the application domain, so under normal circumstances, an assembly cannot be updated on disk until all the application domains that are using it have been unloaded.

Если для домена приложения настроено теневое копирование файлов, сборки по пути приложения копируются в другое расположение и загружаются из него.When an application domain is configured to shadow copy files, assemblies from the application path are copied to another location and loaded from that location. Копия блокируется, но исходный файл сборки разблокирован, и его можно обновить.The copy is locked, but the original assembly file is unlocked and can be updated.

Важно!

Единственными сборками, которые подлежат теневому копированию, являются сборки, хранящиеся в каталоге приложения или в его подкаталогах, указанных в свойствах ApplicationBase и PrivateBinPath при настройке домена приложения.The only assemblies that can be shadow copied are those stored in the application directory or its subdirectories, specified by the ApplicationBase and PrivateBinPath properties when the application domain is configured. Хранящиеся в глобальном кэше сборки не подлежат теневому копированию.Assemblies stored in the global assembly cache are not shadow copied.

В этом разделе содержатся следующие подразделы:This article contains the following sections:

  • Включение и использование теневого копирования — содержит описание основных принципов использования и параметров, доступных для теневого копирования.Enabling and Using Shadow Copying describes the basic use and the options that are available for shadow copying.

  • Производительность при запуске — содержит описание изменений, внесенных в теневое копирование в .NET Framework 4 с целью улучшить производительность при запуске, а также способов возврата к поведению более ранних версий.Startup Performance describes the changes that are made to shadow copying in the .NET Framework 4 to improve startup performance, and how to revert to the behavior of earlier versions.

  • Устаревшие методы — содержит описание изменений, внесенных в свойства и методы, которые контролируют теневое копирование в .NET Framework 2.0.Obsolete Methods describes the changes that were made to the properties and methods that control shadow copying in the .NET Framework 2.0.

Включение и использование теневого копированияEnabling and Using Shadow Copying

Чтобы настроить теневое копирование для домена приложения, можно использовать свойства класса AppDomainSetup.You can use the properties of the AppDomainSetup class as follows to configure an application domain for shadow copying:

  • Чтобы включить теневое копирование, присвойте свойству ShadowCopyFiles строковое значение "true".Enable shadow copying by setting the ShadowCopyFiles property to the string value "true".

    По умолчанию этот параметр вызывает копирование всех сборок по пути приложения в кэш загрузки перед их загрузкой.By default, this setting causes all assemblies in the application path to be copied to a download cache before they are loaded. Это тот же кэш, который поддерживается средой CLR для хранения файлов, загруженных с других компьютеров. Среда CLR автоматически удаляет файлы, если они больше не требуются.This is the same cache maintained by the common language runtime to store files downloaded from other computers, and the common language runtime automatically deletes the files when they are no longer needed.

  • При необходимости задайте произвольное местоположение для теневой копии файлов с помощью свойств CachePath и ApplicationName.Optionally set a custom location for shadow copied files by using the CachePath property and the ApplicationName property.

    Базовый путь к расположению формируется путем присоединения свойства ApplicationName к свойству CachePath в качестве подкаталога.The base path for the location is formed by concatenating the ApplicationName property to the CachePath property as a subdirectory. Сборки копируются в подкаталоги этого пути, а не в сам путь.Assemblies are shadow copied to subdirectories of this path, not to the base path itself.

    Примечание

    Если свойство ApplicationName не задано, то свойство CachePath игнорируется и используется кэш загрузки.If the ApplicationName property is not set, the CachePath property is ignored and the download cache is used. Исключение не возникает.No exception is thrown.

    Если указано пользовательское расположение, вы самостоятельно выполняете очистку каталогов и скопированных файлов, если они больше не требуются.If you specify a custom location, you are responsible for cleaning up the directories and copied files when they are no longer needed. Автоматически они не удаляются.They are not deleted automatically.

    Существует несколько причин, по которым рекомендуется задать пользовательское расположение для теневой копии файлов.There are a few reasons why you might want to set a custom location for shadow copied files. Это может потребоваться сделать, если приложение создает большое количество копий.You might want to set a custom location for shadow copied files if your application generates a large number of copies. Кэш загрузки ограничен по размеру, а не по времени существования, поэтому возможно, что среда CLR попытается удалить файл, который все еще используется.The download cache is limited by size, not by lifetime, so it is possible that the common language runtime will attempt to delete a file that is still in use. Также пользовательское расположение следует указывать, если пользователи приложения не имеют прав на запись в каталог, который среда CLR использует для кэша загрузки.Another reason to set a custom location is when users running your application do not have write access to the directory location the common language runtime uses for the download cache.

  • При необходимости можно ограничить сборки, подлежащие теневому копированию, с помощью свойства ShadowCopyDirectories.Optionally limit the assemblies that are shadow copied by using the ShadowCopyDirectories property.

    При включении теневого копирования для домена приложения по умолчанию будут копироваться все сборки из пути приложения, то есть из каталогов, указанных в свойствах ApplicationBase и PrivateBinPath.When you enable shadow copying for an application domain, the default is to copy all assemblies in the application path — that is, in the directories specified by the ApplicationBase and PrivateBinPath properties. Вы можете ограничить копирование выбранных каталогов, создав строку, содержащую только те каталоги, теневые копии которых требуется создать, и присвоив эту строку свойству ShadowCopyDirectories.You can limit the copying to selected directories by creating a string that contains only those directories you want to shadow copy, and assigning the string to the ShadowCopyDirectories property. Для разделения каталогов используется точка с запятой.Separate the directories with semicolons. Единственными сборками, которые подлежат теневому копированию, являются сборки из выбранных каталогов.The only assemblies that are shadow copied are the ones in the selected directories.

    Примечание

    Если не присвоить строку свойству ShadowCopyDirectories или присвоить ему значение null, выполняется теневое копирование всех сборок в каталогах, указанных в свойствах ApplicationBase и PrivateBinPath.If you don’t assign a string to the ShadowCopyDirectories property, or if you set this property to null, all assemblies in the directories specified by the ApplicationBase and PrivateBinPath properties are shadow copied.

    Важно!

    Пути к каталогам не должны содержать точку с запятой, так как она является разделителем.Directory paths must not contain semicolons, because the semicolon is the delimiter character. Escape-символа для точки с запятой не существует.There is no escape character for semicolons.

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

Когда запускается домен приложения, использующий теневое копирование, возникает задержка, пока сборки копируются из каталога приложения в каталог теневого копирования или проверяются, если они уже находятся в этом каталоге.When an application domain that uses shadow copying starts, there is a delay while assemblies in the application directory are copied to the shadow copy directory, or verified if they are already in that location. До появления .NET Framework 4 все сборки копировались во временный каталог.Before the .NET Framework 4, all assemblies were copied to a temporary directory. Каждая сборка открывалась для проверки имени сборки и строгого имени.Each assembly was opened to verify the assembly name, and the strong name was validated. Каждая сборка проверялась на предмет того, обновлялась ли она позднее копии в каталоге теневого копирования.Each assembly was checked to see whether it had been updated more recently than the copy in the shadow copy directory. Если это было так, сборка копировалась в каталог теневого копирования.If so, it was copied to the shadow copy directory. Наконец, временные копии удалялись.Finally, the temporary copies were discarded.

Начиная с .NET Framework 4 при запуске по умолчанию происходит прямое сравнение даты и времени файла каждой сборки в каталоге приложения с датой и временем копии файла в каталоге теневого копирования.Beginning with the .NET Framework 4, the default startup behavior is to directly compare the file date and time of each assembly in the application directory with the file date and time of the copy in the shadow copy directory. Если сборка была обновлена, она копируется с использованием той же процедуры, что и в более ранних версиях .NET Framework; в противном случае загружается копия из каталога теневого копирования.If the assembly has been updated, it is copied by using the same procedure as in earlier versions of the .NET Framework; otherwise, the copy in the shadow copy directory is loaded.

Повышение итоговой производительности является наибольшим для приложений, сборки которых меняются нечасто, а изменения обычно появляются в небольшом подмножестве сборок.The resulting performance improvement is largest for applications in which assemblies do not change frequently and changes usually occur in a small subset of assemblies. Если большинство сборок приложения меняется часто, новое поведение по умолчанию может явиться причиной снижения производительности.If a majority of assemblies in an application change frequently, the new default behavior might cause a performance regression. Можно восстановить поведение при запуске предыдущих версий .NET Framework, добавив элемент <shadowCopyVerifyByTimestamp> в файл конфигурации с логическим значением enabled="false".You can restore the startup behavior of previous versions of the .NET Framework by adding the <shadowCopyVerifyByTimestamp> element to the configuration file, with enabled="false".

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

Класс AppDomain имеет несколько методов, например SetShadowCopyFiles и ClearShadowCopyPath, которые можно использовать для управления теневым копированием в домене приложения, но в .NET Framework версии 2.0 они были помечены как устаревшие.The AppDomain class has several methods, such as SetShadowCopyFiles and ClearShadowCopyPath, that can be used to control shadow copying on an application domain, but these have been marked obsolete in the .NET Framework version 2.0. Рекомендуемый способ настройки теневого копирования для домена приложения — это использование свойств класса AppDomainSetup.The recommended way to configure an application domain for shadow copying is to use the properties of the AppDomainSetup class.

См. такжеSee also