关于影子复制

今天开始学习电子书“ASP.NET基础教程——C#案例版”看到许多之前通过视频学习时没有看到的概念,故打算对这些概念进行一个整理。也就是说以后的几篇文章主要就是针对这些比较新鲜的概念。

————————————————————以下是正文——————————————————

影子复制是公共语言运行时(CLR)提供的一种机制。

“一个.net的服务程序想实现类似ASP.NET中更新bin文件夹下DLL无需重启IIS的功能,这个功能有个正式的名称叫影子复制(shadow copy)。因为在.NET中程序集无法卸载 ,所有我们把可能经常要变动的部分编译成一个单独的程序集并加载到新的应用程序域中(AppDomain)。”(以上这句话是摘自 stay hungry 的博客,如果想要了解详细内容,请点击他的名字进入原文章)

 stay hungry 的这句话我是这样理解的:由于我们可能要常常的对网站的程序进行更新,但是在更新一些模块的时候,我们无法在不停止IIS运行的情况下进行。而如果停止IIS运行的话,不可避免的会对网站造成负面影响,所以我们需要一种机制,一种在网站运行的情况下可以动态的更新网站的这些模块的功能。而这个功能就是影子复制。

以上是对于影子复制的功能或者说是定义上的描述,下面通过在教材和互联网上的学习,我将影子复制的具体实现过程进行了一个整理。

首先要说明的是,这个机制的实现主要需要对三个属性进行设置:

ShadowCopyFiles : AppDomainSetup类的属性,boolean类型;用于说明是否需要开启影子复制机制

CachePath : AppDomainSetup类的属性,string类型;用于指定影子副本的基目录,也就是影子副本所保存的目录

SetShadowCopyPath():AppDomain类的方法;指定可以使用影子复制机制的目录

然后说明的是影子复制机制的具体实现过程:

在没有启动影子复制机制时:在asp.net页面运行时,会从bin目录调用页面所引用的程序集(如:ABC),也就是说,因为页面正在运行,所以如果我们要更改这个被引用的程序集(如:ABC),就需要先停止引用这个程序集,然后替换,然后在重新引用。在这个过程中,所必须做的是,关掉IIS,因为页面正在引用程序集,而为了停止引用就必须要停止页面,也就是说,要关掉IIS。

在启动影子复制机制后:在加载asp.net页面的时候,也就是在用户得到页面之前,系统自动将开启了影子复制机制的程序集从其所在的目录A(SetShadowCopyPath方法所指定的目录)复制到一个目录B(CachePath属性所指向的目录)中,然后再从目录B中引用程序集。这样,当我们要修改程序集的时候,我们只要在目录A中修改,然后当页面再次被加载时,就会自动的将新程序集从目录A复制到目录B,然后再从目录B中引用。

最后,由于个人的水平有限,所以不能够提供一个实现的代码例子。所以如果想要知道具体的例子,就希望大家可以访问 stay hungry(点击名字,进入文章) 的关于影子目录的文章了。

posted @ 2010-02-11 16:23  Margin22  阅读(1228)  评论(0编辑  收藏  举报