Pra*_*eek 6 .net clr assemblies shadow-copy appdomain
从我到目前为止的理解,通过阅读这篇文档,例如:http://msdn.microsoft.com/en-us/library/ms404279.aspx,卷影复制是一项功能,允许使用的组件,而目前由应用程序加载.
从上面的doc:
公共语言运行库在加载程序集时锁定程序集文件,因此在卸载程序集之前无法更新该文件.从应用程序域卸载程序集的唯一方法是卸载应用程序域,因此在正常情况下,在卸载所有正在使用它的应用程序域之前,无法在磁盘上更新程序集.将应用程序域配置为卷影复制文件时,应用程序路径中的程序集将复制到另一个位置并从该位置加载.副本已锁定,但原始程序集文件已解锁并可以更新.
但似乎有时加载的程序集没有被锁定,因此Shadow副本没用.
为了说明这一点,我使用以下代码创建了一个简单的库A.dll:
using System;
public class A
{
public A()
{
Console.WriteLine("A");
}
}
Run Code Online (Sandbox Code Playgroud)
然后我将其加载到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");
}
}
Run Code Online (Sandbox Code Playgroud)
所以我期望当程序挂在ReadLine上时,我不应该使用A.dll程序集,但它似乎根本没有锁定:我甚至可以删除它!
所以这是我的问题:
1)为什么在此示例中加载的组件未锁定?
2)何时装配锁定,即阴影复制是否有用?
在此先感谢您的帮助.
小智 4
当应用程序域重新启动时,卷影副本非常有用。例如。假设您的程序使用自己的应用程序域启动一组插件,并在后台下载更新版本。如果应用程序域是使用卷影复制启动的,那么您的插件实现 DLL 可以更新,您可以重新加载插件,新版本将通过应用程序域重新启动而获取。
| 归档时间: |
|
| 查看次数: |
3148 次 |
| 最近记录: |