Вопрос

Мне нужна такая установка, как эта:

+- /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 загружен и использовать этот экземпляр

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top