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