我正在开发一个基于插件的应用程序,并且需要能够在发生某些事情时将数据(字符串,数组)发布回我的主EXE。我不太清楚如何解决这个问题,我已经考虑过在主应用程序中创建一个线程,它会不断调用DLL中的方法请求数据,但这看起来非常低效,是否有某种事件监听器我可以用于此?
感谢。
答案 0 :(得分:2)
作为插件DLL的加载机制的一部分,您可以传入一个类对象/函数指针/委托/事件,DLL可以使用它来通知主应用程序插件生成的任何事件。 / p>
答案 1 :(得分:1)
您应该考虑使用Inversion of Control。
的形式,而不是轮询DLL这可以像在exe订阅的dll中暴露事件一样简单,或者将对象(或接口)传递给DLL,它可以用来调用方法来通知你的可执行文件等。有很多这里的选项,如果没有关于您的架构的更多信息,很难知道最好的。
答案 2 :(得分:0)
您可以在DLL上使用代理/事件并使用您的EXE订阅吗?
答案 3 :(得分:0)
让我们设置一些基线...
如果是这种情况,最简单的方法是在插件类型中定义一个事件。
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以在更新任何可视控件之前获取UI线程。
答案 4 :(得分:0)
如果它是托管DLL(C#,VB,带有ref类的CLI / C ++)
在项目的引用中引用DLL。
右键点击项目 - >添加参考 - >浏览 - >选择文件。
执行此操作后,您应该获取API,并以正常的C#方式使用它。
可以访问DLL中声明的名称空间,以及所有对象。