Я разрабатываю приложение с подключаемым модулем и должен иметь возможность отправлять данные (строки, массивы) обратно в мой основной EXE, когда что-то происходит. Я не совсем уверен, как это сделать, я подумал о создании потока в главном приложении, которое будет постоянно вызывать метод в DLL с запросом данных, но это кажется очень неэффективным, есть ли какой-то прослушиватель событий, который я мог бы использовать для этого?
Спасибо.
Как часть механизма загрузки для подключаемых DLL файлов, вы можете передать указатель/делегат/событие класса/объекта, который DLL может использовать для информирования основного приложения о любых событиях, которые генерирует плагин.
Вместо опроса DLL, вы должны рассмотреть возможность использования формы Inversion of Control.
Это может быть так же просто, как выставлять событие в dll, которое ваш exe подписывается или передает объект (или интерфейс) в DLL, который он может использовать для вызова методов для уведомления вашего исполняемого файла и т.д. Существует много варианты здесь, и его трудно узнать самое лучшее без дополнительной информации о вашей архитектуре.
Если это управляемая DLL (С#, VB, CLI/С++ с классами ref)
Ссылка на DLL в ссылках на проект.
Щелкните правой кнопкой мыши по проекту → Добавить ссылку → Обзор → Выберите файл.
После этого вы должны получить API и использовать его обычным способом С#.
Доступны пространства имен, объявленные в DLL, и все объекты.
Вы можете использовать делегаты/события в своей DLL и подписаться с вашим 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, чтобы получить поток пользовательского интерфейса перед обновлением любых визуальных элементов управления.