C# 将数据从dll发送回.exe
我正在开发一个基于插件的应用程序,需要能够在出现问题时将数据(字符串、数组)发回主EXE。我不太确定该怎么做,我曾想过在主应用程序中创建一个线程,该线程将连续调用DLL中的一个方法来请求数据,但这似乎效率很低,是否有某种类型的事件侦听器可用于此C# 将数据从dll发送回.exe,c#,multithreading,events,dll,plugins,C#,Multithreading,Events,Dll,Plugins,我正在开发一个基于插件的应用程序,需要能够在出现问题时将数据(字符串、数组)发回主EXE。我不太确定该怎么做,我曾想过在主应用程序中创建一个线程,该线程将连续调用DLL中的一个方法来请求数据,但这似乎效率很低,是否有某种类型的事件侦听器可用于此 谢谢。作为插件DLL加载机制的一部分,您可以传入一个类对象/函数指针/委托/事件,DLL可以使用该类对象/函数指针/委托/事件通知主应用程序插件生成的任何事件。您可以在DLL上使用委托/事件并订阅EXE,而不是轮询DLL,你应该考虑使用一个.< /p>的
谢谢。作为插件DLL加载机制的一部分,您可以传入一个类对象/函数指针/委托/事件,DLL可以使用该类对象/函数指针/委托/事件通知主应用程序插件生成的任何事件。您可以在DLL上使用委托/事件并订阅EXE,而不是轮询DLL,你应该考虑使用一个.< /p>的形式。
这可以简单到公开exe订阅的dll中的事件,或将对象(或接口)传递到dll,以便调用方法通知可执行文件等。这里有许多选项,如果没有关于您的体系结构的更多信息,就很难知道最佳方案。让我们设定一些基线
- 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线程。如果是托管DLL(C#、VB、CLI/C++和ref类)
在项目的引用中引用DLL
右键单击项目->添加参考->浏览->选择文件。
这样做之后,您应该获得API,并以正常的C#方式使用它
DLL中声明的名称空间以及所有对象都可以访问 DLL也是C#(.Net)吗?还是不受管理?@Yochai:你的意思是“还是本地的?”?C#==managedsounds不错,以前从未尝试过函数指针,但我会尝试一下。谢谢你的建议