Benutzerdefinierte AppDomain und PrivateBinPath

8

Ich verwende c # 4.0 und eine Konsolenanwendung nur zum Testen, der folgende Code gibt eine Ausnahme.

%Vor%

Ich erhalte immer die Ausnahme "Datei nicht gefunden", wenn ich Laden auf meiner erstellten Anwendungsdomäne verwende.

Danke.

    
Ahmed Galal 08.07.2011, 15:21
quelle

3 Antworten

5

Ich glaube, ich habe herausgefunden, warum das passiert, weil die aktuelle Domäne die Assembly laden muss, auch wenn Sie die Assembly in eine andere App-Domäne laden, muss die aktuelle Domäne darüber Bescheid wissen und sie laden weil wie das .NET entworfen wurde.

Überprüfen Sie hier für Details.

Ссылка

und als ich die Fusionsprotokolle überprüft habe, habe ich festgestellt, dass die neu erstellte Anwendungsdomäne die Assembly erfolgreich aus dem privaten bin-Pfad laden konnte und der Grund, warum Sie immer noch die Ausnahme von "Datei nicht gefunden" erhalten, weil dies Ausnahme gehört ursprünglich zur aktuellen App-Domäne.

Das bedeutet, dass Sie die Assembly in Ihre benutzerdefinierte Domäne laden können, wenn Sie die Assembly im aktuellen Anwendungspfad oder in den Pfad kopiert haben, in dem die aktuelle Domäne sondiert.

Ich hoffe, das hilft.

    
Ahmed Galal 12.07.2011, 00:20
quelle
9

Stelle zuerst sicher, dass Plugins ein Unterverzeichnis deines AppDomain Basispfads sind. PrivateBinPath funktioniert nur für Unterverzeichnisse wie beschrieben hier

Wenn das nicht das Problem ist, dann werfen Sie einen Blick auf Ihre Fusion Binding Protokolle. Verwenden Sie den Fusionsprotokoll-Viewer Es gibt auch ein gutes Blogbeitrag zu diesem Thema. In den Fusionsprotokollen wird angezeigt, wo nach der Assembly gesucht wurde. Das sollte Ihnen sagen, ob Ihr Pfad in der Suche enthalten ist.

Eine der anderen Möglichkeiten besteht darin, dass Sie Ihre Assembly finden, aber nicht eine ihrer Abhängigkeiten. Der Fusionsprotokoll-Viewer wird es Ihnen erneut sagen.

    
Mike Two 08.07.2011 20:00
quelle
5

Ich stieß auf diesen Thread, als ich versuchte, eine DLL-Datei dynamisch von einem Verzeichnis außerhalb des bin-Verzeichnisses zu laden. Lange Rede, kurzer Sinn, das konnte ich mit dem AppDomain.CurrentDomain.AssemblyResolve -Ereignis erreichen. Hier ist der Code:

%Vor%

Die Methode CurrentDomain_AssemblyResolve wird jedesmal aufgerufen, wenn die Methode AppDomain.CurrentDomain.Load("...") aufgerufen wird. Dieser benutzerdefinierte Event-Handler erledigt die Aufgabe, die Assembly mithilfe Ihrer eigenen benutzerdefinierten Logik zu lokalisieren (was bedeutet, dass Sie festlegen können, dass die Assembly überall, auch außerhalb des Bin-Pfads, usw. angezeigt werden soll). Ich hoffe, das spart jemand anderen ein paar Stunden ...

    
MattEvansDev 22.05.2013 19:43
quelle

Tags und Links