Ich versuche, Anwendung mit Plugins zu machen.
Ich habe MainLib.dll, wo ich eine Commnon-Schnittstelle mit einer Methode erstellt habe (sei es ICommon
). Dann habe ich 2 .dlls (plugins) erstellt, die auf MainLib.dll verweisen und die ICommon
in einigen Klassen implementieren. Außerdem habe ich alle Referenzen in diesem .dlls expt System
entfernt.
Dann habe ich eine Anwendung erstellt, die den Ordner ".\Plugins"
überwacht und alle .dlls in newDomain
lädt. Überprüfen Sie, ob die Dateitypen in .dll ICommon
implementieren (daher verweist diese Anwendung auch auf MainLib.dll). Wenn ja - füge den Namen von .dll in eine Liste ein.
Und jetzt hier das Problem : Bevor ich versuche, Plugins zu laden - lade ich MailLib.dll und System auf newDomain, da alle Plugins eine Abhängigkeit von dieser .dlls haben. Sie laden korrekt. Dann fange ich an, Plugins zu laden, und hier habe ich:
FileNotFoundException, Datei oder Assembly konnte nicht geladen werden 'PluginWithException, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' oder eine seiner Abhängigkeiten. Das System kann die angegebene Datei nicht finden.) On string Assembly loadedAssembly = domain.Load (Assembly.LoadFrom (asm) .FullName);
PluginWithException Assembly hat nur 2 Abhängigkeit - System und MainLib. Bevor ich PluginWithException geladen habe, habe ich Assemblys in der neuen Domäne überprüft, System und MainLib wurden in diese Domäne geladen. So kann ich keine Abhängigkeit mit Abhängigkeit sehen. Ich lese dieses Thema , und versuchte die Lösung mit ProxyDomain
, aber die Ausnahme ist die gleiche.
Was mache ich falsch?
Hier der Code:
%Vor%Sie geben nicht an, wie Sie Ihre Suchpfade für Ihre AppDomains einrichten, so dass sie die DLLs im Plugins-Verzeichnis finden können, aber Ihr Problem klingt vielleicht sehr ähnlich zu dem, das ich gestern beantwortet habe:
AppDomain.Load () schlägt mit FileNotFoundException fehl
Vielleicht wird dies auch Ihr Problem lösen? Lass mich wissen, wie es dir geht.
Sie können der Domäne mitteilen, wo Ihre Assemblys geladen werden sollen:
AppDomain domain = AppDomain.CreateDomain("tmpDomain", null, new AppDomainSetup { ApplicationBase = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins") });
Ich sehe jedoch nicht, warum Sie Assemblierungen in der aktuellen (Standard) Domäne und auch in der tmpDomain laden.
Tags und Links c# plugins appdomain .net-assembly