Как изменить путь загрузки ссылок в .NET?
-
03-07-2019 - |
Вопрос
Мне нужна такая установка, как эта:
+- /ApplicationFolder
-- App.exe
-- Core.dll
-- AnotherShared.dll
+- /PluginsFolder
-- plugin1.dll
-- plugin2.dll
А потому, что plugin1.dll ссылки на Core.dll и Общие.DLL, когда я компилирую приложение, оно падает копия "Copy.dll" и "Shared.dll" в папку plugins, а если я их снять не работает больше.
Как я могу решить эту проблему?
Решение
Когда вы создаете AppDomain, вы можете определить путь для загрузки сборок.Установленный AppDomainSetup.PrivateBinPath
и перейдите в AppDomain.Создайте домен.
Использование AppDomain - хорошая идея для плагинов (допускает разные CAS и выгрузку).
Чтобы VS / msbuild не копировал сборки, на которые даны ссылки, в выходной каталог, измените "Копировать локально" на false в свойствах ссылки.
Другие советы
Мое приложение MEF настроено так, что проекты плагинов компилируются в свою собственную папку (по умолчанию), затем я использую команду post-build для копирования определенных файлов в папку output extensions.
Другой способ - создать проект непосредственно в соответствующей выходной папке и, как сказал другой плакат, открыть панель "Свойства" для каждой соответствующей ссылки в вашем проекте плагина и установить для "Копировать локально" значение false.
вы можете попробовать это: Как я могу установить PrivateBinPath в MEF?
или вы можете попробовать обработать Appdomain.Событие AssemblyResolve, которое возникает всякий раз, когда .net не может найти сборку.там вы можете реализовать пользовательскую логику для поиска и загрузки сборок из любого места.
вспомогательный модуль eventhandler AssemblyResolve возвращает либо искомую сборку, либо null, так что вы можете вернуть уже загруженную Core.dll из доступных в AppDomain.Метод GetAssemblies().
однако в вашем случае должно быть нормально просто не включать Code.dll с plugin1.dll, .net уже должен понимать, что Core.dll загружен и использовать этот экземпляр