我正在开发基于插件的应用程序,并且需要能够在出现问题时将数据(字符串,数组)返回到主EXE。我不太清楚如何去解决这个问题,我曾想过在主应用程序中创建一个线程,它会不断调用DLL中的方法来询问数据,但这看起来效率很低,是否有某种事件监听器可以为此使用?将数据发送回dll的.exe
谢谢。
我正在开发基于插件的应用程序,并且需要能够在出现问题时将数据(字符串,数组)返回到主EXE。我不太清楚如何去解决这个问题,我曾想过在主应用程序中创建一个线程,它会不断调用DLL中的方法来询问数据,但这看起来效率很低,是否有某种事件监听器可以为此使用?将数据发送回dll的.exe
谢谢。
作为插件DLL的加载机制的一部分,您可以传入一个类对象/函数指针/委托/事件,该DLL可用于通知主应用程序插件生成的任何事件。
您可以在您的DLL上使用Delegates/Events并订阅您的EXE?
而不是轮询DLL,你应该考虑使用Inversion of Control的形式。
这可以像在你的EXE预订的dll中暴露事件一样简单,或者将一个对象(或接口)传递给它可以用来调用方法来通知你的可执行文件的DLL。这里有很多选择,如果没有关于你的架构的更多信息,它很难知道最好的选择。
让我们设置一些基线...
如果是这种情况,最简单的事情就是在您的插件类型中定义一个事件。
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线程。
如果它是一个托管的DLL(C#,VB,CLI/C++与裁判班)
参考项目的引用的DLL。
右键单击项目 - >添加引用 - >浏览 - >选择文件。
你这样做后,你应该得到的API,并以正常的C#方式使用它。
在DLL中声明的名称空间将是可访问的,并且所有对象也是可以访问的。
是C#(.Net)的DLL吗?还是不受管理? – 2011-01-31 17:37:53
@Yochai:你的意思是“还是原生的?” ? C#==托管 – 2011-01-31 17:41:09