更新:2007 年 11 月
用于应用程序域中的程序集通过影像复制可以在不卸载应用程序域的情况下进行更新。这对必须不间断使用的应用程序(如 ASP.NET 网站)尤为有用。
加载程序集时,公共语言运行库会将程序集文件锁定,因此只有卸载了程序集之后才能更新该文件。从应用程序域卸载程序集的唯一方法是卸载该应用程序域,因此在正常情况下,只有卸载了使用程序集的所有应用程序域之后才能在磁盘上更新程序集。
将应用程序域配置为影像复制文件时,来自应用程序路径的程序集被复制到另一个位置并从该位置进行加载。该副本被锁定,但原始程序集文件将取消锁定并可以进行更新。
![]() |
---|
配置了应用程序域之后,由 ApplicationBase 和 PrivateBinPath 属性指定应用程序目录或其子目录,只有存储在以上目录中的程序集才能进行影像复制。存储在全局程序集缓存中的程序集不能进行影像复制。 |
下面的列表介绍如何使用 AppDomainSetup 类的属性配置用于进行影像复制的应用程序域。
-
通过将 ShadowCopyFiles 属性设置为字符串值 "true" 来启用影像复制。
默认情况下,这会导致应用程序路径中的所有程序集在加载前被复制到下载缓存。这与公共语言运行库所维护的用于存储从其他计算机下载的文件的缓存相同,并且公共语言运行库会自动删除不再需要的文件。
-
另外,也可以选择使用 CachePath 属性和 ApplicationName 属性为影像复制的文件设置自定义位置。通过将 ApplicationName 属性作为子目录连接到 CachePath 属性构成自定义位置的基路径。程序集将被影像复制到此路径的子目录,而不是基路径本身。
说明:
如果未设置 ApplicationName 属性,则忽略 CachePath 属性并使用下载缓存。不引发异常。
如果您指定了自定义位置,则需负责当不再需要这些目录和已复制的文件时将它们清除。它们不会自动被删除。
可能需要为影像复制的文件设置自定义位置的原因有两个。如果应用程序生成了大量副本,则您可能需要为影像复制的文件设置自定义位置。限制下载缓存的因素是大小而非生存期,因此公共语言运行库可能会尝试删除仍然在使用的文件。设置自定义位置的另一个原因是:运行应用程序的用户对公共语言运行库用作下载缓存的目录位置不具有写访问权限。
-
另外,可以选择使用 ShadowCopyDirectories 属性限制进行影像复制的程序集。
对应用程序域启用了影像复制时,默认会复制应用程序路径(即由 ApplicationBase 和 PrivateBinPath 属性指定的目录)中的所有程序集。通过创建一个字符串,使其中仅包含希望进行影像复制的目录,然后将该字符串赋给 ShadowCopyDirectories 属性,这样可以限制对所选目录进行复制。使用分号分隔路径。只有所选目录中的程序集进行了影像复制。