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

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

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

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

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

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

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

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

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


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


Ответы (1)


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

The plugins have a reference to the main exe

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

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

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

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

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

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

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

person Paul Walls    schedule 06.09.2011
comment
Большое спасибо ! Мне удалось заставить все работать, мне пришлось ссылаться на те же библиотеки DLL, что и основной exe, я просто указал на выходной каталог для сборки. Как ни странно, раньше это не работало. - person Anadrol; 06.09.2011
comment
Не уверен, какая часть помогла, но я рад, что у вас все заработало! Не стесняйтесь отмечать это как ответ. - person Paul Walls; 06.09.2011
comment
+1 за хороший ответ, независимо от того, использовал ОП или нет :) - person Adam Sills; 06.09.2011