MEF lädt Plugins aus einem freigegebenen Netzwerkordner

8

Meine Haare zerreißen, um herauszufinden, warum ich dieses Problem habe, hoffe also, dass jemand helfen kann.

Ich habe ein Programm, das MEF verwendet, um Plugins zu laden. Ich möchte, dass der Client- und Server-Teil des Systems den gleichen Plugin-Speicher verwenden kann, der sich auf dem Server befindet.

Mein Problem ist, dass wenn ich den Plugin-Speicherort auf " C:\Users\Administrator\Desktop\ClientPlugins " setze, das Plugin geladen wird. Wenn ich den Speicherort auf " \XRP-SERVER\Users\Administrator\Desktop\ClientPlugins " ändere, wird das Plugin nicht geladen.

Wenn ich " \XRP-SERVER\Users\Administrator\Desktop\ClientPlugins " in Windows Explorer eintrage, wird der Ort gefunden und die Plugin-DLL ist da.

Bitte könnte jemand helfen.

Lassen Sie es mich wissen, wenn Sie weitere Informationen benötigen.

Wie bei einem Vorschlag habe ich versucht, die Konfiguration so zu bearbeiten, dass sie Folgendes enthält, aber das hat die Probleme nicht behoben ....

%Vor%

Mit freundlichen Grüßen

Asche

    
user589195 09.11.2011, 10:46
quelle

4 Antworten

2

Ich bin gestern auf dieses Problem gestoßen und habe das Problem darauf beschränkt, wie MEF Baugruppen lädt. Wenn Sie ein DirectoryCatalog erstellen, erstellt es abwechselnd eine Sammlung von AssemblyCatalogs. Jeder AssemblyCatalog führt ein:

%Vor%

Der Aufruf von Assembly.Load löst eine Sandbox-Exception (aus einem Grund, den ich noch nicht erklären kann) und daher werden keine Teile gefunden, da sie den Fehler stillschweigend abfängt.

Das lustige ist, dass das Aufrufen von Assembly.LoadFrom(<pathToYourDll>) , um ein Assembly zurückzugeben, gut funktioniert (es wird keine Ausnahme ausgelöst). Kombinieren Sie das mit dem überladenen Konstruktor von AssemblyCatalog , der ein Assembly als Eingabe verwendet und Sie selbst einen Workaround haben!

Anstatt also DirectoryCatalog zu verwenden, liste ich alle DLLs im Pfad auf und erstelle iterativ ein AssemblyCatalog und füge es meinem CompositionContainer hinzu.

Hinweis: Ich verwende das Flag loadFromRemoteSources="true" in meiner App.Config und es ist erforderlich, sonst stürzt es immer ab.

Hoffe, das hilft

    
sebd 10.11.2011, 12:58
quelle
8

Sicherheitsrichtlinien deaktivieren normalerweise das Laden von Remotecode (dh Assemblys an einem externen Speicherort).

Sie können die folgende Konfigurationsänderung versuchen:

%Vor%

Beachten Sie außerdem, dass beim Kopieren von Dateien von Netzwerkstandorten in der Regel eine Zone in ihrem alternativen Datenstrom angegeben wird. Im Explorer kann dies mithilfe des Befehls "Entsperren" beim Anzeigen der Eigenschaften einer Datei entfernt werden.

Alternativ können Sie die Zone auch programmatisch aus dem alternativen Datenstrom entfernen, wie in der Abbildung gezeigt. hier auf Mike Hadlows Blog .

    
Matthew Abbott 09.11.2011 12:18
quelle
2

Nur um klarzustellen, dass die Antwort von sebd funktioniert.

Hier ist der letzte Code, den ich benutzt habe.

%Vor%     
user589195 11.11.2011 11:06
quelle
0

Versuchen Sie, System.IO.Path.PathSeparator anstelle von \?

zu verwenden

Oder kann die Datei zuerst an den Client-Speicherort abgerufen werden?

Ich bin mir nicht ganz sicher, aber ich würde es versuchen.

    
Anton 09.11.2011 11:30
quelle

Tags und Links