Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Доступ к сторонним пространствам имен в C # из плагина

Автор вопроса: AnadrolОтветов: 1

Мне нужно продолжить чей-то проект C #, но я не могу с ним разговаривать.

Основная программа NameSpace A использует библиотеки DLL с NameSpaces B C D ...

Эта основная программа загружает подключаемые библиотеки DLL во время выполнения, эти библиотеки должны иметь доступ к пространствам имен A B C D ...

Но проблема в том, что библиотеки DLL могут получить доступ только к пространству имен A!

Плагины имеют ссылку на основной exe.

Что очень странно, так это то, что уже скомпилированный exe (последняя версия), который я получил из основной программы, действительно имеет ссылку в обозревателе объектов библиотеки DLL для проекта NameSpaces ABCD, но когда я сам компилирую основную программу exe, DLL может только см. NameSpace A!

У меня есть источник всех проектов всех пространств имен.

Любая помощь будет тепло приветствоваться, это сводит меня с ума!

  • Попробуйте сначала собрать все проекты всех именных пространств, после чего удалите их ссылку на ваш основной проект. Создайте основной проект и укажите ссылку на все пространство имен проектов, а затем заново создайте его. BizApps 06.09.2011

pluginsnamespacesdll

Ответы

Ответ 1 · рейтинг 2 · Paul Walls

...these plugin DLLs must access NameSpaces A B C D

The plugins have a reference to the main exe

Возможно, здесь отсутствует информация или мне не хватает сна, но это определенно похоже на странную "модель плагина". К сожалению, не зная больше, возможно, намного больше, я не знаю, как помочь в вашей текущей ситуации.

Тем не менее, я настоятельно рекомендую рассмотреть возможность изменения архитектуры ваших плагинов. Либо:

  1. Сделайте их частью реального проекта или;
  2. Преобразуйте их в более традиционную модель плагинов.

Если вы выберете дверь № 2, эта статья о блоке приложений расскажет, что Я бы рассмотрел традиционную модель плагинов и, вероятно, значительно облегчил бы вашу жизнь, если бы вы ее приняли.

Изменить: я просто понял, что мой ответ, вероятно, был слишком кратким и не объяснял, что я имел в виду под "традиционной моделью плагина".

Плагины не должны напрямую ссылаться на ваше приложение, а также не должны требовать перестройки или повторного развертывания для их использования. Обычно интерфейс определяется в одном проекте (иногда называемом отдельным интерфейсом), но реализовать его отдельно. Другими словами, плагин может знать о базовой библиотеке, содержащей интерфейс, но не должен знать об основном исполняемом файле, который его использует.

Итак, на практике вы определяете интерфейс в своей основной библиотеке, который определяет методы, которые приложение требует от плагина. Затем вы кодируете свое основное приложение для этого интерфейса. Затем во время инициализации вашего основного приложения во время выполнения вы можете загрузить сборки, содержащие классы подключаемых модулей, и создать экземпляр подключаемого модуля или даже инициализировать его тестовым классом во время разработки. Есть много примеров того, как это сделать, и есть несколько вопросов по SO и об этом тоже.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы