Wie der Ladepfad von Referenzen in .NET ändern?
-
03-07-2019 - |
Frage
Ich möchte ein Setup wie folgt aus:
+- /ApplicationFolder
-- App.exe
-- Core.dll
-- AnotherShared.dll
+- /PluginsFolder
-- plugin1.dll
-- plugin2.dll
Aber weil plugin1.dll Verweise auf core.dll und Shared.dll wenn ich die Anwendung kompilieren fällt es eine Kopie von „Copy.dll“ und „Shared.dll“ auf Plugin-Ordner als auch, und wenn ich sie entfernen es doesn ‚t mehr arbeiten.
Wie kann ich dieses Problem lösen?
Lösung
Wenn Sie eine AppDomain erstellen können Sie einen Pfad zum Laden von Baugruppen definieren. Setzen Sie AppDomainSetup.PrivateBinPath
und übergeben zu AppDomain.Create Domäne.
ein AppDomain ist eine gute Idee für Plugins (ermöglicht unterschiedliche CAS-und Entladen).
Um VS / msbuild Kopieren referenzierten Assemblys in das Ausgabeverzeichnis, ändern „Copy Local“ auf falsch in den Eigenschaften der Referenz zu vermeiden.
Andere Tipps
Meine MEF-Anwendung ist so eingerichtet, dass die Plug-Projekte kompilieren, um ihre eigenen Ordner (wie das der Standard ist), dann benutze ich einen Post-Build-Befehl bestimmte Dateien auf die Ausgangserweiterungen Ordner zu kopieren.
Der andere Weg ist das Projekt direkt in die entsprechenden Ausgabeordner erstellen haben und, wie das andere Plakat sagte, öffnen Sie das Fenster „Eigenschaften“ für jede relevante Referenz in Ihrem Plugin-Projekt und „Copy Local“ auf false gesetzt.
Sie können versuchen, diese: Wie kann ich PrivateBinPath in MEF gesetzt
oder Sie können versuchen, die AppDomain.AssemblyResolve Event-Handling, die jederzeit angehoben .net kippt eine Baugruppe lokalisieren. dort können Sie benutzerdefinierte Logik zu lokalisieren und Last-Baugruppen von überall.
implementierendie AssemblyResolve Eventhandler jsut gibt entweder die Assembly, die für oder null angesehen wird durchgeführt, so dass Sie die bereits geladen core.dll aus verfügbar von den AppDomain.GetAssemblies zurückkehren konnte () -Methode.
aber in Ihrem Fall sollte es in Ordnung sein, einfach nicht Code.dll mit plugin1.dll umfassen, .net sollte bereits erkennen, dass core.dll geladen und verwendet diese Instanz