2010-09-01 7 views
6

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.

+1

Ho provato il codice e funziona come previsto: il gruppo è bloccato e non può essere eliminato finché non esiste il programma di test. – Mormegil

+0

Hum, interessante, quindi sembra che il comportamento non sia deterministico e possa differire in diversi contesti. Questo è abbastanza confuso. – Pragmateek

risposta

4

Le copie shadow sono utili al riavvio del dominio dell'app. Per es. supponi che il tuo programma avvii una serie di plugin utilizzando i propri domini delle app e in background scarichi una versione aggiornata. Se il dominio dell'app viene avviato utilizzando la copia shadow, la DLL di implementazione del plug-in può essere aggiornata ed è possibile ricaricare il plug-in e la nuova versione verrà rilevata dal riavvio dell'appdomain.

+0

Grazie per questo esempio è un'illustrazione perfetta dell'utilità della copia shadow. Ma il motivo per cui il campione ha funzionato nel modo in cui è rimasto rimane un mistero. – Pragmateek

Problemi correlati