Итак, у меня есть проект .NET, в котором используются плагины. Плагины реализованы в виде проектов библиотеки классов (DLL), каждый из которых создается в своей собственной папке. Основной проект не требует запуска подключаемых библиотек DLL, но если они доступны, они используются для различных дополнительных функций. Классы из плагинов загружаются Type.GetType()
.
Однако для моих собственных целей при тестировании программного обеспечения я хотел бы иметь возможность разрабатывать плагины и основное приложение одновременно. Я создал «главный» файл решения, который ссылается на все проекты, поэтому я могу устанавливать точки останова и переходить границы сборки. Однако проблема в том, что плагины создаются в своих собственных каталогах, поэтому мне нужно каким-то образом получить DLL-файлы плагинов где-то, где Type.GetType()
их можно найти.
Изменить: чтобы уточнить, мой код уже перечисляет файлы DLL в том же каталоге, что и .exe, и находит классы, соответствующие заданному интерфейсу (используя Assembly.LoadFile()
, Assembly.GetExportedTypes()
и Type.IsAssignableFrom()
). Затем пользователь выбирает плагины для включения, и я сохраняю эти варианты в базе данных с помощью Type.AssemblyQualifiedName
. Наконец, когда мне нужно использовать функции, предоставляемые плагином, я использую Type.GetType()
для загрузки класса плагина. Все это работает именно так, как задумано. Просто когда я создаю приложение, я получаю копию .exe без каких-либо плагинов. Я ищу способ структурировать файлы проекта и решения, чтобы я мог разделить основное приложение и проекты плагинов, но при этом иметь возможность отлаживать их вместе в Visual Studio. Имеет ли это смысл?
Пока у меня такие идеи:
Добавить ссылки на проекты подключаемых модулей из основного проекта.
Это имеет то преимущество, что оно всегда будет работать должным образом в моей среде отладки, но вызовет ли это проблемы при развертывании моего приложения без подключаемых модулей ? Я проверил с помощью Dependency Walker, и похоже, что нет прямой зависимости от DLL, созданной ссылкой на проект. Есть ли какие-то скрытые проблемы, о которых нужно знать?Измените все проекты подключаемых модулей для сборки в один и тот же целевой каталог.
Казалось бы, это работает достаточно хорошо, но это также запутывает мое дерево сборки и затрудняет разработку только одного проект без извлечения других проектов (сейчас все они являются родственными папками в Subversion).Добавить сценарий пост-сборки для копирования плагинов в другой каталог.
На самом деле это то, что я делаю в данный момент, и это работает достаточно хорошо, но кажется очень хакерским и хрупким. Я хотел бы перейти на другой подход.Найти для
Type.GetType()
способ поиска библиотек DLL в других каталогах
Это похоже на то, как я использовал быLD_LIBRARY_PATH
в системе Unix. Очевидно, я хотел бы включить это только для сборок отладки, так как в режиме выпуска это может вызвать множество тонких проблем в системе пользователя. Но возможно ли это? Если да, то как?
Интересно, что в этом руководстве по этому вопросу говорится:
Первое, что нужно сделать, это сослаться на библиотеку классов, которую мы только что создали, и установить выходные данные сборки в тот же каталог.
Мне это кажется неоптимальным. Есть ли способ лучше?