C#中两个插件之间的通信

Posted

技术标签:

【中文标题】C#中两个插件之间的通信【英文标题】:Communication between two plugins in C# 【发布时间】:2020-10-17 02:23:22 【问题描述】:

我有两个插件在第三方主机应用程序中工作。此主持人有一个名为 DocumentOpened 的事件。

我从插件 A 和插件 B 订阅此事件。显然插件 A 和插件 B 彼此不认识。我想要实现的是在 B 处理完事件后再次将控制权交给插件 A。

Plugin A)

Host.DocumentOpened += SomeCodeA()


Plugin B)
Host.DocumentOpened += SomeCodeB()

现在,在插件 A 中执行一些操作!再次进入B后,不知道如何将控制权返回给A!

所以我们说在这一切完成之后调用 PluginA.Method()!

【问题讨论】:

在这种情况下不要关闭事件。有一个全局变量来指示 A 或 B 是否具有控制权。当 A 具有控制权时,您可以忽略 B 事件。当 B 处于控制状态时,忽略 A 事件。 嗨@jdweng 我不想忽略这些事件,我希望所有事件都被执行,但是在事件 B 之后我想再次从 A 执行一些事情! 你需要一个队列,所以 B 等到 A 完成。所以你需要一个只处理队列请求的进程。 那不是我想要的顺序。 有很多方法可以处理队列。我只是说您需要一个队列,并且您必须确定处理的优先级/顺序。 【参考方案1】:

为此,您可能需要某种方式让插件 A 和 B 相互通信。以下是一些方法,但可能还有其他方法:

EventWaitHandle

一个相当简单的方法是使用system wide synchronization event。两个插件都将创建一个同名的 EventWaitHandle。然后插件 A 可以创建一个等待事件的线程,插件 B 将设置该事件。如果插件 B 不存在,则永远不会引发该事件。这是一个系统范围的事件,因此如果主机的多个实例正在运行,则不会起作用,除非您执行诸如在事件名称中包含处理器 ID 之类的操作。

IPC/RPC 方法

进程之间可以使用多种通信方式:

命名管道 消息总线 网络服务 Windows 通信基础

这将是一个更复杂的解决方案,但也会更通用。例如,它可以处理主机应用程序决定在单独的进程中运行插件,或者如果您想在插件之间传输更多数据。

共享程序集

您可以创建一个供您的两个插件使用的程序集。这将允许您创建一个在两个插件之间共享的单例对象。像这样的:

public class PluginCommunication

    public event EventHandler MyEvent;
    public void RaiseEvent() => MyEvent?.Invoke(this, EventArgs.Empty);
    public static PluginCommunication PluginBEvent = new PluginCommunication();

插件 B 将调用 PluginCommunication.PluginBEvent.RaiseEvent();,插件 A 将附加一个事件处理程序,如 PluginCommunication.PluginBEvent.MyEvent += PluginAEventHandler;

这种方法存在潜在的缺陷。如果您需要以任何方式更改程序集,您将面临插件 A 使用版本 1 和插件 B 使用版本 2 的风险,如果您不小心,这可能会以严重的方式结束。如果您不在主线程上执行所有操作,也可能会出现线程问题。

【讨论】:

以上是关于C#中两个插件之间的通信的主要内容,如果未能解决你的问题,请参考以下文章

使用c#在两个进程之间进行通信

在 C# 中的两个窗体之间进行通信

C# 两个进程之间通讯(管道通信 )

在两个 C# exe 之间进行通信 [关闭]

python 示例如何通过内存设置文件在Sublime Text 3的插件之间进行通信。将两个python文件放入插件目录,包括

在c#中使用命名管道在两个进程之间进行双工操作