In .NET realizzare una applicazione che carica dinamicamente codice tramite plugin è uno scherzo grazie al metodo Assembly.LoadFrom(), esistono però alcuni problemi legati alla serializzazione. Se dovete deserializzare ad esempio un tipo di dato che si trova presente in una dll che avete caricato dinamicamente tramite il LoadFrom(), purtroppo vi si genererà un errore di assembly non trovato, anche se l'assembly è stato caricato. Inoltre in un caso particolare mi trovo a non avere nemmeno caricato il file al momento della deserializzazione e quello che cerco è un modo per ritardare il caricamento di un assembly, e farlo solamente quando si rivela necessario per la deserializzazione di un oggetto.
La soluzione è l'evento AssemblyResolve dell'oggetto AppDomain, che viene generato ogniqualvolta l'appdomain non riesce a risolvere un nome di assembly permettendo di specificare manualmente l'assembly cercato, per questa ragione basta scrivere una piccola classe helper che permette di impostare dall'esterno i possibili path che contengono gli assembly da caricare.
A questo punto si crea un metodo che è in grado di gestire l'evento AssemblyResolve. Tale metodo prima controlla se l'assembly cercato è stato già caricato, in caso contrario scandisce tutte le cartelle alla ricerca di una dll che matcha il nome dell'assembly.
Nel primo blocco si cicla semplicemente tra gli assembly caricati nell'AppDomain corrente e si ritorna l'assembly se lo si trova già caricato, nel secondo blocco viene invece semplicemente fatta una ricerca su tutte le cartelle che contengono gli assembly esterni alla ricerca dell'assembly necessario, se non viene trovato nulla si torna null e il sistema genererà la solita eccezione di assembly non trovato.
Alk.