根据我目前所了解的情况,例如通过阅读此文档:http: //msdn.microsoft.com/en-us/library/ms404279.aspx,卷影复制是一项允许在当前使用程序集的功能由应用程序加载。
从上面的文档:
公共语言运行时会在程序集加载时锁定程序集文件,因此在卸载程序集之前无法更新文件。从应用程序域中卸载程序集的唯一方法是卸载应用程序域,因此在正常情况下,在所有使用它的应用程序域都已卸载之前,无法在磁盘上更新程序集。当应用程序域配置为卷影复制文件时,应用程序路径中的程序集将复制到另一个位置并从该位置加载。副本已锁定,但原始程序集文件已解锁并且可以更新。
但似乎有时加载的程序集没有被锁定,所以影子副本是无用的。
为了说明这一点,我使用以下代码创建了一个简单的库 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) 程序集何时被锁定,即卷影副本何时是有用的功能?
在此先感谢您的帮助。