2009-10-13 3 views
6

Come posso dire alla mia applicazione .NET dove cercare un particolare assieme di cui ha bisogno (diverso dal GAC o dalla cartella da dove viene eseguita l'applicazione)? Ad esempio, vorrei mettere un assembly nella cartella Temp dell'utente e far sapere alla mia applicazione che l'assembly di riferimento si trova nella cartella temp.Ricerca di .NET Assembly in un'altra posizione

Grazie

risposta

6

è possibile utilizzare l'evento AppDomain.AssemblyResolve aggiungere personalizzato di montaggio resolver. Ciò consente di puntare ad altre directory o anche a database per ottenere gli assembly necessari.

Ho persino utilizzato un codice simile per scaricare gli assembly da un database e archiviarli in IsolatedStorage. Il nome del file come hash del nome completo dell'Assembly. Quindi il database dovrebbe essere scaricato solo la prima volta che si risolve e tutte le risoluzioni future saranno servite dal file system. Il meglio dell'evento AssemblyResolve è che puoi usarlo Type.GetType() e i Serializzatori incorporati.

static string lookupPath = @"c:\otherbin"; 

static void Main(string[] args) 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += 
     new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
} 

static Assembly CurrentDomain_AssemblyResolve(object sender, 
               ResolveEventArgs args) 
{ 
    var assemblyname = new AssemblyName(args.Name).Name; 
    var assemblyFileName = Path.Combine(lookupPath, assemblyname + ".dll"); 
    var assembly = Assembly.LoadFrom(assemblyFileName); 
    return assembly; 
} 
+1

Come menzionato [qui] (http://www.codeproject.com/Articles/310675/AppDomain-AssemblyResolve-Event- Suggerimenti), usa 'string assemblyname = new AssemblyName (args.Name) .Name;' invece di usare 'Split (',')'. – kroimon

+0

Grazie per il suggerimento. –

3

Vedi questo discussione per alcune delle questioni coinvolte:

http://bytes.com/topic/c-sharp/answers/248203-dynamic-assembly-loading

In sostanza, non è possibile modificare l'AppBase di un AppDomain dopo che è stato creato. È necessario specificarlo come parte della configurazione prima di crearne uno nuovo, che non ti aiuterà nell'applicazione predefinita .

Se il gruppo che si desidera caricare è in una directory sotto la corrente AppBase allora si può aggiungere il suo percorso relativo utilizzando il AppendPrivatePath (relativePath), e quindi utilizzare Assembly.Load - il runtime sarà sondare le sottodirectory per tu. Questo è il modo migliore/più semplice per gestire lo .

+0

Grazie, come nota, non ho bisogno di caricarlo dinamicamente. Mi riferisco all'assemblea nel mio progetto. Ma quando distribuisco quell'applicazione, voglio che l'applicazione sappia che l'assembly di riferimento sarà nella cartella temporanea –