Доступ к сторонним пространствам имен в C # из плагина - PullRequest
0 голосов
/ 06 сентября 2011

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

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

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

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

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

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

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

Любая помощь будет приветствоваться, это движетя чокнутый!

1 Ответ

2 голосов
/ 06 сентября 2011

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

The plugins have a reference to the main exe

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

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

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

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

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

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

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

...