.net 程序集锁定规则以及卷影复制何时有用?
根据我到目前为止的理解,通过阅读本文档,例如:,卷影复制是一种允许在当前由应用程序加载时使用程序集的功能 从上述文件: 公共语言运行库在加载程序集时锁定程序集文件,因此在卸载程序集之前无法更新该文件。从应用程序域卸载程序集的唯一方法是卸载应用程序域,因此在正常情况下,在卸载所有使用程序集的应用程序域之前,无法在磁盘上更新程序集。 将应用程序域配置为卷影复制文件时,应用程序路径中的程序集将复制到另一个位置并从该位置加载。副本已锁定,但原始部件文件已解锁并可以更新 但有时加载的程序集似乎没有被锁定,因此,卷影副本是无用的 为了说明这一点,我创建了一个简单的库a.dll,其中包含以下代码:.net 程序集锁定规则以及卷影复制何时有用?,.net,assemblies,clr,appdomain,shadow-copy,.net,Assemblies,Clr,Appdomain,Shadow Copy,根据我到目前为止的理解,通过阅读本文档,例如:,卷影复制是一种允许在当前由应用程序加载时使用程序集的功能 从上述文件: 公共语言运行库在加载程序集时锁定程序集文件,因此在卸载程序集之前无法更新该文件。从应用程序域卸载程序集的唯一方法是卸载应用程序域,因此在正常情况下,在卸载所有使用程序集的应用程序域之前,无法在磁盘上更新程序集。 将应用程序域配置为卷影复制文件时,应用程序路径中的程序集将复制到另一个位置并从该位置加载。副本已锁定,但原始部件文件已解锁并可以更新 但有时加载的程序集似乎没有被锁定,
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重新启动时将获取新版本 我尝试了你的代码,它按预期工作–程序集被锁定,并且在测试程序存在之前无法删除。嗯,很有趣,因此行为似乎不是确定性的,在不同的上下文中可能会有所不同。这是相当令人困惑的。感谢这个例子,它完美地说明了阴影复制的有用性。但是,为什么这个样本会这样工作,仍然是个谜。