Frage

Diese Frage hat hier bereits eine Antwort:

Wie kann ich meiner .NET -Anwendung mitteilen, wo sie nach einer bestimmten Baugruppe suchen soll, die sie benötigt (außer dem GAC oder dem Ordner, aus dem die Anwendung ausgeführt wird)? Zum Beispiel möchte ich eine Montage in den Temp -Ordner des Benutzers einfügen und meine Anwendung wissen lassen, dass sich die referenzierte Baugruppe im Temp -Ordner befindet.

Vielen Dank

War es hilfreich?

Lösung

du kannst den ... benutzen Appdomain.AssemblyResolve Ereignis zum Hinzufügen von benutzerdefinierten Montage -Resolvers. Auf diese Weise können Sie auf andere Verzeichnisse oder sogar Datenbanken hinweisen, um nach Bedarf Assemblys zu erhalten.

Ich habe sogar einen ähnlichen Code verwendet, um Assemblys aus einer Datenbank herunterzuladen und in IsolatedStorage zu speichern. Der Dateiname als Hash des vollständigen Montage -Namens. Anschließend müsste die Datenbank nur zum ersten Mal herunterladen, und alle zukünftigen Auflösungen werden vom Dateisystem bedient. Das Beste an der AssemblyResolve -Veranstaltung ist, dass Sie es verwenden können. Gettype () und die integrierten Serialisierer.

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;
}

Andere Tipps

Sehen Sie sich diese Diskussion für einige der beteiligten Themen an:

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

Grundsätzlich können Sie die Appbase eines Appdomain nach seiner Erstellung nicht ändern. Sie müssen es als Teil der Konfiguration angeben, bevor Sie eine neue erstellen, die Ihnen in der Standard -Appdomain nicht hilft.

Wenn sich die Montage, die Sie laden möchten, in einem Verzeichnis unter der aktuellen Appbase befindet, können Sie ihren relativen Pfad mit dem AppendPrivatePath (RelativePath) hinzufügen und dann die Assembly verwenden. Dies ist der beste/einfachste Weg, um damit umzugehen.

System.Reflection.Assembly.LoadFrom(myFile);

http://msdn.microsoft.com/en-us/library/1009fa28.aspx

Eine andere Alternative besteht darin, die Ereignisse von Assembly -Lösungen selbst wie in dieser stackoverflow -Frage zu behandeln: Wie füge ich den Ordner zum Montage -Suchpfad zur Laufzeit in .NET hinzu?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top