c# - 我可以通过哪些方式从应用程序域中的插件发送数据,从而触发 C# 中主应用程序中的事件?

标签 c# events plugins message appdomain

我有一个加载一些插件的主应用程序。这些插件使用继承自“MarshalByRefObject”的类在单独的应用程序域中加载和运行;这一切都很好。

我现在需要的是一种方法来处理插件何时希望主应用程序执行某些操作,以及一种在主应用程序中动态处理它的方法。如果最好的方法是轮询插件以获取命令列表,那么我可以这样做,尽管这看起来有点麻烦。

从插件跨应用域向主应用发送请求的最佳方式是什么?

更新

作为问题的更新,我希望跨应用程序域发送数据,使主应用程序执行某些操作,例如“文件->新建”操作或“GetSomeData()”调用。在这样做时,我需要让插件等待主应用程序完成它正在做的任何事情,但也能够决定主应用程序端是否执行请求的功能/事件。

我是通过向插件传递一个接口(interface)来做到这一点的。该接口(interface)由主应用程序中的一个类实现,该类定义了一些事件。然后主应用程序可以订阅这些事件,插件可以触发主应用程序功能。问题是接口(interface)只引用了我传递接口(interface)时的类。也就是说,如果我创建了没有订阅事件的类,然后像这样传递接口(interface):

CallbackClass myCallbackClass = new CallbackClass();
pluginInterface.HeresMyCallbackClass((ICallbackClass)myCallbackClass);

插件将接收接口(interface),但对原始类的任何更改都不会传播。所以添加:

myCallbackClass.MyMainAppEvent += new MainEventHandler(MyMainAppFunction);

不会改变事件的插件版本。该插件可以这样做:

//code within plugin
ICallbackClass callToMainApp;
public HeresMyCallbackClass(ICallbackClass cbClass)
{
    callToMainApp = cbClass;
}

public CallAMainAppFunction()
{
    callToMainApp.CallTheSubscribedFunction(); //This is where it all goes wrong
}

...但是它尝试调用的事件为空。现在,如果我先让主应用程序订阅事件,然后传递接口(interface),这不是问题:

CallbackClass myCallbackClass = new CallbackClass();
myCallbackClass.MyMainAppEvent += new MainEventHandler(MyMainAppFunction); //Subscribe first
pluginInterface.HeresMyCallbackClass((ICallbackClass)myCallbackClass);

然后插件可以调用 CallTheSubscribedFunction() 并且该事件将在主应用程序中触发。我需要能够按需订阅此类事件,因为主应用程序中的某些内容/事件/数据在不同时间可用。

因此,我试图避免写出很多信息,但我想我的问题相对于我的问题来说太笼统了。

如果有人有建议请告诉我。同样,我的目标是允许插件在主应用程序中触发事件,等待主应用程序完成,然后继续执行,主应用程序可能会或可能不会订阅事件。

更新 2

我知道以上信息专门针对我的应用程序,但我也在寻找一般性建议。因此,如果可以选择使用线程,请告诉我一般情况下的工作方式。如果另一个案例会更好,我需要做一些重新设计来实现它,也请告诉我。只是在这里寻找建议。谢谢。

最佳答案

Mike,从表面上看,您已经满足了我的要求,您应该在主应用程序域和辅助应用程序域中的类之间使用观察者模式。

您可能只需要消除现有代码中的一些粗糙边缘,换言之,遵循/实现观察者模式。

它的工作方式是主域中的类订阅已加载到辅助应用程序域中的类引发的“事件”。我猜您需要在实例化辅助应用程序域类时执行此操作。如果您要卸载应用程序域,则还要确保“订阅”已“断开连接”。

这有意义吗?

关于c# - 我可以通过哪些方式从应用程序域中的插件发送数据,从而触发 C# 中主应用程序中的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4880288/

相关文章:

javascript - 快速移动光标时未触发 onMouseLeave 事件

jquery - 使用 jQuery .load() 回调和图像

python - Django ckeditor 无法添加 youtube 插件

c# - 无法加载文件或程序集 'Newtonsoft.Json'

javascript - 如何使用preventDefault重写而不是return false?

c# - Server.Transfer 在 Application_Error 中不起作用

cakephp - Paypal PRO 与 Cakephp(或只是 php)的集成

plugins - Quartz Composer 条码扫描器

c# - 如何将 C# 与 Postgres 连接起来?

c# - 复选框数据绑定(bind)默认值 null