Cerchi Assembly .NET in un posto diverso [duplicare]
-
21-09-2019 - |
Domanda
Questa domanda ha già una risposta qui:
Come faccio a dire al mio NET dove cercare un particolare assemblaggio di cui ha bisogno (diverso dal GAC o la cartella in cui l'applicazione viene eseguita da)? Per esempio vorrei mettere un assembly nella cartella Temp dell'utente e avere la mia applicazione a sapere che l'Assemblea si fa riferimento si trova nella cartella Temp.
Grazie
Soluzione
è possibile utilizzare l'evento AppDomain.AssemblyResolve aggiungere personalizzato di montaggio resolver. Questo consente di puntare ad altre directory o database anche per ottenere assemblee, se necessario.
Ho anche utilizzato codice simile per scaricare assemblee da un database e conservare in IsolatedStorage. Il nome del file come un hash del nome completo Assembly. Poi il database avrebbe solo bisogno di scaricare la prima volta a risolvere e tutte le future risoluzioni sarà servita dal file system. Il migliore di circa l'evento AssemblyResolve è che si può utilizzare Type.GetType () e il costruito nel Serializzatori.
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;
}
Altri suggerimenti
Si veda la discussione di alcune delle questioni coinvolte:
http://bytes.com/topic/c -sharp / risposte / 248203-dinamico-assemblaggio a caricamento
In sostanza, non è possibile modificare l'AppBase di un AppDomain dopo che è stato creato. È necessario specificare come parte del configurazione prima di crearne uno nuovo, che non ti aiutano a default AppDomain.
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 voi. Questo è il modo migliore / più semplice per gestire la cosa.
System.Reflection.Assembly.LoadFrom(myFile);
http://msdn.microsoft.com/en-us/library /1009fa28.aspx
Un'altra alternativa è quella di gestire all'Assemblea risolvere gli eventi stessi come in questa domanda StackOverflow: Come aggiungere cartelle al percorso di ricerca di assembly in fase di esecuzione in .NET?