.net 程序集锁定规则以及卷影复制何时有用?

.net 程序集锁定规则以及卷影复制何时有用?,.net,assemblies,clr,appdomain,shadow-copy,.net,Assemblies,Clr,Appdomain,Shadow Copy,根据我到目前为止的理解,通过阅读本文档,例如:,卷影复制是一种允许在当前由应用程序加载时使用程序集的功能 从上述文件: 公共语言运行库在加载程序集时锁定程序集文件,因此在卸载程序集之前无法更新该文件。从应用程序域卸载程序集的唯一方法是卸载应用程序域,因此在正常情况下,在卸载所有使用程序集的应用程序域之前,无法在磁盘上更新程序集。 将应用程序域配置为卷影复制文件时,应用程序路径中的程序集将复制到另一个位置并从该位置加载。副本已锁定,但原始部件文件已解锁并可以更新 但有时加载的程序集似乎没有被锁定,

根据我到目前为止的理解,通过阅读本文档,例如:,卷影复制是一种允许在当前由应用程序加载时使用程序集的功能

从上述文件:

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

但有时加载的程序集似乎没有被锁定,因此,卷影副本是无用的

为了说明这一点,我创建了一个简单的库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");
 }
}
因此,我希望当程序挂在读线上时,我不能使用A.dll程序集,但它似乎根本没有被锁定:我甚至可以删除它

下面是我的问题:

1)为什么在此示例中加载的程序集未锁定?

2)程序集何时锁定,即卷影复制是一项有用的功能时?


提前感谢您的帮助。

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

我尝试了你的代码,它按预期工作–程序集被锁定,并且在测试程序存在之前无法删除。嗯,很有趣,因此行为似乎不是确定性的,在不同的上下文中可能会有所不同。这是相当令人困惑的。感谢这个例子,它完美地说明了阴影复制的有用性。但是,为什么这个样本会这样工作,仍然是个谜。