从dll将数据发送回.exe

时间:2011-01-31 17:35:00

标签: c# multithreading events dll plugins

我正在开发一个基于插件的应用程序,并且需要能够在发生某些事情时将数据(字符串,数组)发布回我的主EXE。我不太清楚如何解决这个问题,我已经考虑过在主应用程序中创建一个线程,它会不断调用DLL中的方法请求数据,但这看起来非常低效,是否有某种事件监听器我可以用于此?

感谢。

5 个答案:

答案 0 :(得分:2)

作为插件DLL的加载机制的一部分,您可以传入一个类对象/函数指针/委托/事件,DLL可以使用它来通知主应用程序插件生成的任何事件。 / p>

答案 1 :(得分:1)

您应该考虑使用Inversion of Control

的形式,而不是轮询DLL

这可以像在exe订阅的dll中暴露事件一样简单,或者将对象(或接口)传递给DLL,它可以用来调用方法来通知你的可执行文件等。有很多这里的选项,如果没有关于您的架构的更多信息,很难知道最好的。

答案 2 :(得分:0)

您可以在DLL上使用代理/事件并使用您的EXE订阅吗?

答案 3 :(得分: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以在更新任何可视控件之前获取UI线程。

答案 4 :(得分:0)

如果它是托管DLL(C#,VB,带有ref类的CLI / C ++)

在项目的引用中引用DLL。

右键点击项目 - >添加参考 - >浏览 - >选择文件。

执行此操作后,您应该获取API,并以正常的C#方式使用它。

可以访问DLL中声明的名称空间,以及所有对象。