影像复制程序集

在应用程序域中使用的程序集通过卷影复制可以在不卸载应用程序域的情况下进行更新。 这对必须不间断使用的应用程序(如 ASP.NET 网站)尤为有用。

加载程序集时,公共语言运行时会将程序集文件锁定,因此只有卸载了程序集之后才能更新该文件。 从应用程序域卸载程序集的唯一方法是卸载该应用程序域,因此在正常情况下,只有卸载了使用程序集的所有应用程序域之后才能在磁盘上更新程序集。

将应用程序域配置为卷影复制文件时,来自应用程序路径的程序集被复制到另一个位置并从该位置进行加载。 该副本被锁定,但原始程序集文件将取消锁定并可以进行更新。

重要说明重要事项

配置了应用程序域之后,由 ApplicationBasePrivateBinPath 属性指定应用程序目录或其子目录,只有存储在以上目录中的程序集才能进行卷影复制。存储在全局程序集缓存中的程序集不能进行卷影复制。

本文包含以下几节:

  • 启用和使用卷影复制描述卷影复制的基本用法以及可用于卷影复制的选项。

  • 启动性能描述 .NET Framework 4 版中为改进启动性能而对卷影复制所做的更改,以及恢复到早期版本的行为的方式。

  • 已过时的方法描述对用于控制 .NET Framework 2.0 中的卷影复制的属性和方法所做的更改。 

启用和使用卷影复制

可按如下方式使用 AppDomainSetup 类的属性以便为卷影复制配置应用程序域:

  • 通过将 ShadowCopyFiles 属性设置为字符串值 "true" 来启用卷影复制。

    默认情况下,此设置会导致应用程序路径中的所有程序集在加载前被复制到下载缓存。 这与公共语言运行时所维护的用于存储从其他计算机下载的文件的缓存相同,并且公共语言运行时会自动删除不再需要的文件。

  • 另外,也可以选择使用 CachePath 属性和 ApplicationName 属性为卷影复制的文件设置自定义位置。

    通过将 ApplicationName 属性作为子目录连接到 CachePath 属性构成自定义位置的基路径。 程序集将被卷影复制到此路径的子目录,而不是基路径本身。

    注意注意

    如果未设置 ApplicationName 属性,则忽略 CachePath 属性并使用下载缓存。不引发异常。

    如果您指定了自定义位置,则需负责当不再需要这些目录和已复制的文件时将它们清除。 它们不会自动被删除。

    可能需要为卷影复制的文件设置自定义位置的原因有几个。 如果应用程序生成了大量副本,则您可能需要为卷影复制的文件设置自定义位置。 限制下载缓存的因素是大小而非生存期,因此公共语言运行时可能会尝试删除仍然在使用的文件。 设置自定义位置的另一个原因是:运行应用程序的用户对公共语言运行时用作下载缓存的目录位置不具有写访问权限。

  • 另外,可以选择使用 ShadowCopyDirectories 属性限制进行卷影复制的程序集。

    对应用程序域启用了卷影复制时,默认会复制应用程序路径(即由 ApplicationBasePrivateBinPath 属性指定的目录)中的所有程序集。 通过创建一个字符串,使其中仅包含希望进行卷影复制的目录,然后将该字符串赋给 ShadowCopyDirectories 属性,这样可以限制对所选目录进行复制。 使用分号分隔路径。 只有所选目录中的程序集进行了卷影复制。

    重要说明重要事项

    目录路径不得包含分号,因为分号是分隔符字符。分号没有转义符。

启动性能

启动使用卷影复制的应用程序域后,在将应用程序目录中的程序集复制到卷影复制目录中时或在验证这些程序集是否已位于该位置时出现延迟。 在 .NET Framework 4 之前,所有程序集将会复制到临时目录中。 打开每个程序集以验证程序集名称,并验证了强名称。 检查每个程序集以查看程序集的更新日期是否比卷影复制目录中的副本的日期更新一些。 如果是这样,则会将该程序集复制到卷影复制目录中。 最后,将丢弃临时副本。

从 .NET Framework 4 开始,默认启动行为是将应用程序目录中每个程序集的文件日期和时间与卷影复制目录中副本的文件日期和时间直接进行比较。 如果程序集已经更新,则使用与早期版本的 .NET Framework 中的相同过程来复制程序集;否则,将加载卷影复制目录中的副本。

如果应用程序的程序集不会频繁更改,并且更改通常发生在小部分程序集中,则获得的性能提高最为显著。 如果应用程序中的大多数程序集频繁更改,则新的默认行为可能会导致性能衰退。 可以通过向配置文件(在 enabled="false" 的情况下)添加 <shadowCopyVerifyByTimestamp> 元素来还原早期版本的 .NET Framework 的启动行为。

已过时的方法

AppDomain 类有若干方法,如 SetShadowCopyFilesClearShadowCopyPath,这些方法可用于控制应用程序域上的卷影复制,但是在 .NET Framework 2.0 版中已将它们标记为过时方法。 配置用于进行卷影复制的应用程序域的推荐方法是使用 AppDomainSetup 类的属性。

请参见

参考

AppDomainSetup.ShadowCopyFiles

AppDomainSetup.CachePath

AppDomainSetup.ApplicationName

AppDomainSetup.ShadowCopyDirectories

其他资源

<shadowCopyVerifyByTimestamp> 元素