views:

43

answers:

0

Hello,

from what I've understood so far, by reading this doc for instance : http://msdn.microsoft.com/en-us/library/ms404279.aspx, Shadow copy is a feature that allows the use of an assembly while currently loaded by an application.

From the above doc :

The common language runtime locks an assembly file when the assembly is loaded, so the file cannot be updated until the assembly is unloaded. The only way to unload an assembly from an application domain is by unloading the application domain, so under normal circumstances, an assembly cannot be updated on disk until all the application domains that are using it have been unloaded. When an application domain is configured to shadow copy files, assemblies from the application path are copied to another location and loaded from that location. The copy is locked, but the original assembly file is unlocked and can be updated.

But it seems like sometimes a loaded assembly is not locked and so Shadow copy is useless.

To illustrate this point I've created a simple library, A.dll, with this code :

using System;

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

Then I load it into an AppDomain with code like the following :

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");
 }
}

So I expected that while the program is hanging on the ReadLine I should not be able to use the A.dll assembly, but it appears that it is not locked at all : I can even delete it !

So here are my questions :

1) Why in this sample the loaded assembly is not locked ?

2) When are assembly locked, ie when shadow copy is a useful feature ?

Thanks in advance for your help.