da quello che ho capito finora, leggendo questo documento ad esempio: http://msdn.microsoft.com/en-us/library/ms404279.aspx, Copia shadow è una funzionalità che consente l'utilizzo di un assieme mentre attualmente è caricato da un'applicazione.Regole di blocco dell'assieme e quando è utile la copia shadow?
Dal documento di cui sopra:
Il Common Language Runtime blocca un file di assiemi quando l'assembly viene caricato, in modo che il file non può essere aggiornato fino a quando il gruppo viene scaricato. L'unico modo per scaricare un assembly da un dominio dell'applicazione è scaricare il dominio dell'applicazione, quindi in circostanze normali un assembly non può essere aggiornato su disco fino a quando tutti i domini dell'applicazione che lo stanno utilizzando non sono stati scaricati. Quando un dominio applicazione è configurato per i file di copia shadow, gli assiemi dal percorso dell'applicazione vengono copiati in un'altra posizione e caricati da tale posizione. La copia è bloccata, ma il file di assemblaggio originale è sbloccato e può essere aggiornato.
ma sembra talvolta un complesso di carica non è bloccata e così ombra copia è inutile.
Per illustrare questo punto ho creato una semplice libreria, A.dll, con questo codice:
using System;
public class A
{
public A()
{
Console.WriteLine("A");
}
}
Poi si carica in un AppDomain con codice come il seguente:
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");
}
}
Quindi mi aspettavo che mentre il programma è appeso su ReadLine, non dovrei essere in grado di utilizzare l'assembly A.dll, ma sembra che non sia affatto bloccato: posso persino cancellarlo!
Così qui sono le mie domande:
1) Perché in questo esempio il gruppo di carico non è bloccato?
2) Quando l'assembly è bloccato, vale a dire quando la copia shadow è una funzionalità utile?
Grazie in anticipo per il vostro aiuto.
Ho provato il codice e funziona come previsto: il gruppo è bloccato e non può essere eliminato finché non esiste il programma di test. – Mormegil
Hum, interessante, quindi sembra che il comportamento non sia deterministico e possa differire in diversi contesti. Questo è abbastanza confuso. – Pragmateek