2011-02-22 14 views
10

C'è un modo con un sistema di plugin (che utilizzerei con un contenitore IoC) per caricare una versione di un assembly in fase di esecuzione e quindi sostituire quella DLL mentre l'AppDomain è in esecuzione? Non voglio riavviare l'applicazione.Sostituire l'assembly in fase di esecuzione con .NET

Fa MEF qualcosa di simile?

risposta

3

Questo è essenzialmente ciò che NUnit fa (o almeno lo ha fatto, non sono stato nel codice da un po 'di tempo). Ma lo fa caricando l'assembly di test in un altro AppDomain, chiamando il codice in quel dominio utilizzando il metodo DoCallback di AppDomain e quindi ricarica l'assembly di test se viene ricompilato.

Così mentre non è possibile scaricare o ricaricare una dll, ma è possibile scaricare e ricaricare un appdomain ed eseguire il codice in esso.

1

È impossibile utilizzare puro .net, perché non c'è modo di scaricare assembly dal dominio. Poiché MEF è scritto nel codice gestito, dubito che sia possibile. Ho risolto questo problema caricando l'assembly in un dominio separato e quando volevo ricaricarlo l'ho interrotto e ricominciato.

+0

Un appodominio può accedere ad altro codice in altri domini di app? Supponiamo di averlo registrato nel mio contenitore IoC, potrebbe risolverlo? –

+0

@Daniel sì, ma è necessario un codice speciale per accedere al codice negli altri [appdomain] (http://msdn.microsoft.com/en-us/library/system.appdomain.aspx). –

+0

Hai un esempio? –

1
+0

Non ne ho bisogno in fase di progettazione. –

+0

Ho letto male la tua domanda ma la mia risposta è sempre la stessa. –

+0

Non vedo come la programmazione rispetto alle interfacce aiuti in questo caso. Sono tutto per questo, ma se la dll deve essere ricaricata per qualsiasi motivo, devi ancora gestirla. Non sono sicuro di quale sia la ragione, ma se è un vero motivo della programmazione rispetto alle interfacce non credo basti. –

0

Sembra che questo articolo CodeProject spiega come farlo. Questa domanda sullo MSDN Forums sembra simile e questo SO question mostra come farlo. Tutti questi link avvisano che le perdite sono state create da problemi che eliminano correttamente AppDomains, quindi l'acquirente deve fare attenzione.

+0

Sono interessato se qualcuno ha qualche esperienza in questo senso, o pensieri che si propongono di utilizzare un altro meccanismo per essere in grado di aggiornare al volo un sito MVC abilitato per i plug-in. – JoeB

0

Non è possibile scaricare dll in un dominio dell'app in esecuzione. Quello che puoi fare è usare MEF e preparare la tua app per gestire molteplici implementazioni. In tal caso, è possibile copiare una nuova dll (una nuova implementazione di un'interfaccia, un modulo, ecc.) Nella cartella MEF, ricomporla e usarla. Ma, attento, ti costerà la memoria.

È possibile leggere e scaricare l'esempio here.

Problemi correlati