Отправить данные обратно в .exe из dll - PullRequest
2 голосов
/ 31 января 2011

Я разрабатываю приложение на основе плагинов, и мне нужно иметь возможность публиковать данные (строки, массивы) обратно в мой основной EXE-файл, когда что-то происходит.Я не совсем уверен, как это сделать, я думал о создании потока в главном приложении, который бы непрерывно вызывал метод в DLL, запрашивающий данные, но это кажется очень неэффективным, есть ли какой-то прослушиватель событий, который я мог быиспользовать для этого?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 31 января 2011

Как часть механизма загрузки библиотек DLL подключаемого модуля, вы можете передать объект класса / указатель на функцию / делегат / событие, которое DLL может использовать для информирования основного приложения о любых событиях, создаваемых подключаемым модулем.

1 голос
/ 31 января 2011

Вместо того, чтобы опрашивать DLL, вы должны рассмотреть возможность использования формы Инверсия управления .

Это может быть так же просто, как выставить событие в dll, на которое подписывается ваш exeили передача объекта (или интерфейса) в библиотеку DLL, которую он может использовать для вызова методов, чтобы уведомить ваш исполняемый файл и т. д. Здесь есть много вариантов, и трудно узнать лучшее без дополнительной информации о вашей архитектуре.

0 голосов
/ 31 января 2011

Если это управляемая DLL (C #, VB, CLI / C ++ с классами ref)

Ссылка на DLL в ссылках проекта.

Щелкните правой кнопкой мыши проект -> Добавитьссылка -> Обзор -> Выбрать файл.

После этого вы должны получить API и использовать его обычным способом на C #.

Пространства имен, объявленные в DLLбудут доступны и все объекты, а также.

0 голосов
/ 31 января 2011

Давайте установим некоторые базовые показатели ...

  • EXE работает
  • EXE загружает DLL, содержащую плагины
  • EXE создает экземпляр типа («плагин»)
  • Плагин начинает ждать события
  • EXE ждет
  • Внешнее событие (в другом потоке) отмечено экземпляром плагина
  • EXE уведомляется о событии

Если это так, самое простое - определить событие в типе вашего плагина.

public interface IPlugin
{
  public event EventHandler SomethingHappened;
  public void StartWatchingForSomething();
}

where the code would be something like...

public static void Main()
{
  foreach (var plugin in LoadAllPluginTypes()) // IoC container, MEF, something
  {
    plugin.SomethingHappened += SomethingHappenedEventHandler;
    plugin.StartWatchingForSomething();
  }

  public void SomethingHappenedEventHandler(object sender, EventArgs e)
  { 
    //derp
  }
}

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

Если ваш EXE-файл является winforms или WPF-проектом, вам придется выполнить Invoke или Dispatcher.Invoke, чтобы войти в поток пользовательского интерфейса, прежде чем обновлять визуальные элементы управления.

0 голосов
/ 31 января 2011

Вы можете использовать Делегаты / События в вашей DLL и подписаться на ваш EXE?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...