【问题标题】:Send data back to .exe from dll将数据从 dll 发送回 .exe
【发布时间】:2011-01-31 17:35:00
【问题描述】:

我正在开发一个基于插件的应用程序,并且需要能够在发生某些事情时将数据(字符串、数组)发布回我的主 EXE。我不太确定如何解决这个问题,我曾考虑在主应用程序中创建一个线程,该线程将不断调用 DLL 中的方法来请求数据,但这似乎效率很低,是否有某种事件监听器我可以用这个吗?

谢谢。

【问题讨论】:

  • DLL 也是 C# (.Net) 吗?还是不受管理?
  • @Yochai:你的意思是“还是本地的?” ? C# == 托管

标签: c# multithreading events dll plugins


【解决方案1】:

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

【讨论】:

  • 听起来不错,以前从未尝试过函数指针,但我会试一试。感谢您的建议
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您可以在您的 DLL 上使用委托/事件并使用您的 EXE 订阅?

    【讨论】:

      【解决方案4】:

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

      • 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 线程。

      【讨论】:

        【解决方案5】:

        如果是托管 DLL(C#、VB、CLI/C++ 和 ref 类)

        在项目的引用中引用 DLL。

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

        完成此操作后,您应该获取 API,并以普通 C# 方式使用它。

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

        【讨论】:

          猜你喜欢
          • 2011-12-16
          • 2011-09-09
          • 2018-11-16
          • 1970-01-01
          • 2017-12-04
          • 2021-05-01
          • 2022-01-09
          • 2019-07-09
          • 1970-01-01
          相关资源
          最近更新 更多