Реализация модулей в приложении
Есть проект на Avalonia, структура которого следующая:
- App
- App.Core
- Module1
- Module2
Все проекты зависят от App.Core, в котором находятся базовые типы для модулей и т.д.
Для реализации модулей используется MEF (System.ComponentModel.Composition).
Модули реализуют базовый класс из App.Core и помимо прочего, предоставляют UserControl, который будет отображаться в App. Сами по себе они запускаемыми приложениями не являются.
App является оконным приложением, которое при запуске загружает модули из папки modules (по крайней мере, должно, но пока что это реализовано просто через ссылку на проекты).
Покуда всё находится в одном решении, и публикуется через проект App, который тянет за собой все зависимости и модули, проблем нет, но со временем модулей может стать много, и я хочу реализовать возможность пользователю загрузить лишь те модули, которые он будет использовать. Тут то и начинаются проблемы.
Если разделять приложение и модули, то придётся компилировать каждый модуль отдельно. Это не проблема, но каждый модуль будет компилироваться вместе с библиотеками, которые уже используются в App.Core, а также часть из зависимостей не используется в App.Core, но используется в App. При этом, у модуля могут быть свои зависимости, которые используются только им, и которые следует включить в результат компиляции. Всё это приведёт к дублированию dll файлов для каждого модуля. Вернее, это будет при использовании dotnet publish, если использовать dotnet build, проблема решается, но появляется другая, в папке будут находится только App.Core.dll, Module1.dll, Module1.deps.json, и никаких библиотек.
Собственно, вопрос в том, можно ли собрать проект так, чтобы вместе с dll самого модуля, находились только зависимости Module1, что не являются зависимостями App.Core? В таком случае я мог бы включить все зависимости App в App.Core и избежать хотя бы дублирование библиотек между модулями и основным приложением.Хотелось бы, чтобы модули могли находится и в другом решении, но для этого им нужно будет как-то ссылаться на App.Core. Как это лучше сделать?
Как основное приложение, так и модули будут обновляться (думаю использовать NetSparkle для обновления приложения, а для загрузки модулей, вероятно, какую-нибудь простенькую апишку на asp net напишу), есть какие-то общие советы и рекомендации?