Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将数据从dll发送回.exe_C#_Multithreading_Events_Dll_Plugins - Fatal编程技术网

C# 将数据从dll发送回.exe

C# 将数据从dll发送回.exe,c#,multithreading,events,dll,plugins,C#,Multithreading,Events,Dll,Plugins,我正在开发一个基于插件的应用程序,需要能够在出现问题时将数据(字符串、数组)发回主EXE。我不太确定该怎么做,我曾想过在主应用程序中创建一个线程,该线程将连续调用DLL中的一个方法来请求数据,但这似乎效率很低,是否有某种类型的事件侦听器可用于此 谢谢。作为插件DLL加载机制的一部分,您可以传入一个类对象/函数指针/委托/事件,DLL可以使用该类对象/函数指针/委托/事件通知主应用程序插件生成的任何事件。您可以在DLL上使用委托/事件并订阅EXE,而不是轮询DLL,你应该考虑使用一个.< /p>的

我正在开发一个基于插件的应用程序,需要能够在出现问题时将数据(字符串、数组)发回主EXE。我不太确定该怎么做,我曾想过在主应用程序中创建一个线程,该线程将连续调用DLL中的一个方法来请求数据,但这似乎效率很低,是否有某种类型的事件侦听器可用于此


谢谢。

作为插件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不错,以前从未尝试过函数指针,但我会尝试一下。谢谢你的建议