Отправить данные обратно в .exe из dll

2

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

Спасибо.

  • 0
    DLL также C # (.Net)? или это неуправляемый?
  • 0
    @Yochai: Вы имеете в виду "или это родной?" ? C # == удалось
Показать ещё 2 комментария
Теги:
dll
multithreading
plugins
events

5 ответов

2
Лучший ответ

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

  • 0
    звучит хорошо, никогда не пробовал указатели функций раньше, но я попробую. Спасибо за предложение
1

Вместо опроса DLL, вы должны рассмотреть возможность использования формы Inversion of Control.

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

0

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

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

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

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

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

0

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

0

Пусть заданы некоторые базовые линии...

  • 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, чтобы получить поток пользовательского интерфейса перед обновлением любых визуальных элементов управления.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню