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

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top