2011-01-31 106 views
2

我正在开发基于插件的应用程序,并且需要能够在出现问题时将数据(字符串,数组)返回到主EXE。我不太清楚如何去解决这个问题,我曾想过在主应用程序中创建一个线程,它会不断调用DLL中的方法来询问数据,但这看起来效率很低,是否有某种事件监听器可以为此使用?将数据发送回dll的.exe

谢谢。

+0

是C#(.Net)的DLL吗?还是不受管理? – 2011-01-31 17:37:53

+0

@Yochai:你的意思是“还是原生的?” ? C#==托管 – 2011-01-31 17:41:09

回答

2

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

0

您可以在您的DLL上使用Delegates/Events并订阅您的EXE?

1

而不是轮询DLL,你应该考虑使用Inversion of Control的形式。

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

0

让我们设置一些基线...

  • EXE运行
  • EXE加载包含插件
  • EXE实例化一个类型( “插件”)
  • 插件开始等待事件的DLL
  • 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线程。

0

如果它是一个托管的DLL(C#,VB,CLI/C++与裁判班)

参考项目的引用的DLL。

右键单击项目 - >添加引用 - >浏览 - >选择文件。

你这样做后,你应该得到的API,并以正常的C#方式使用它。

在DLL中声明的名称空间将是可访问的,并且所有对象也是可以访问的。