程序集锁定规则和何时是卷影副本有用吗?

时间:2010-09-01 22:24:05

标签: .net assemblies clr appdomain shadow-copy

从目前为止我所理解的,通过阅读此文档,例如:http://msdn.microsoft.com/en-us/library/ms404279.aspx卷影副本是一种允许在应用程序当前加载时使用程序集的功能

从上面的doc:

  

公共语言运行库在加载程序集时会锁定程序集文件,因此在卸载程序集之前无法更新该文件。从应用程序域卸载程序集的唯一方法是卸载应用程序域,因此在正常情况下,在卸载所有正在使用它的应用程序域之前,无法在磁盘上更新程序集。   将应用程序域配置为卷影复制文件时,应用程序路径中的程序集将复制到另一个位置并从该位置加载。副本已锁定,但原始程序集文件已解锁并可以更新。

但有时加载的程序集似乎没有被锁定,因此卷影复制是没用的。

为了说明这一点,我使用以下代码创建了一个简单的库A.dll:

using System;

public class A
{
 public A()
 {
  Console.WriteLine("A");
 }
}

然后我将其加载到AppDomain中,代码如下:

using System;
using System.Reflection;

class Test
{
 static void Main()
 {
  AppDomainSetup configuration = new AppDomainSetup
  {
   ShadowCopyFiles = "false"
  };

  AppDomain appDomain = AppDomain.CreateDomain("", null, configuration);

  Console.WriteLine(appDomain.ShadowCopyFiles);

  Assembly assembly = appDomain.Load("A");
  assembly.CreateInstance("A");

  Console.ReadLine();

  assembly.CreateInstance("A");
 }
}

所以我预计,当程序挂在 ReadLine 上时,我不应该使用A.dll程序集,但它似乎根本没有锁定:我甚至可以删除它!

所以这是我的问题:

1)为什么在此示例中未加载已加载的装配?

2)何时装配锁定,即阴影副本是否有用?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

应用程序域重新启动时,卷影副本非常有用。例如。假设您的程序使用自己的应用程序域启动一组插件,并在后台下载更新的版本。如果使用卷影副本启动应用程序域,则可以更新插件实现DLL,并且可以重新加载插件,新版本将由appdomain restart重新启动。