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

Mik*_*ebb 5 c# events plugins message appdomain

我有一个主应用程序加载一些插件.这些插件使用继承自"MarshalByRefObject"的类在单独的应用程序域中加载和运行; 一切正常.

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

从应用程序域中的插件向主应用程序发送请求的最佳方法是什么?

UPDATE

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

我通过传递插件接口来做到这一点.此接口由主应用程序中定义某些事件的类实现.然后主应用程序可以订阅这些事件,插件可以激活主应用程序功能.问题是接口只引用了我通过接口时的类.即如果我创建了没有订阅事件的类,那么就像这样传递接口:

CallbackClass myCallbackClass = new CallbackClass();
pluginInterface.HeresMyCallbackClass((ICallbackClass)myCallbackClass);
Run Code Online (Sandbox Code Playgroud)

插件将接收接口,但对原始类的任何更改都不会传播.所以补充:

myCallbackClass.MyMainAppEvent += new MainEventHandler(MyMainAppFunction);
Run Code Online (Sandbox Code Playgroud)

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

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

public CallAMainAppFunction()
{
    callToMainApp.CallTheSubscribedFunction(); //This is where it all goes wrong
}
Run Code Online (Sandbox Code Playgroud)

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

CallbackClass myCallbackClass = new CallbackClass();
myCallbackClass.MyMainAppEvent += new MainEventHandler(MyMainAppFunction); //Subscribe first
pluginInterface.HeresMyCallbackClass((ICallbackClass)myCallbackClass);
Run Code Online (Sandbox Code Playgroud)

然后插件可以调用CallTheSubscribedFunction(),事件将在主应用程序中触发.我需要能够按需订阅这样的事件,因为主应用程序中的某些事物/事件/数据在不同时间可用.

所以,我试图避免写出很多信息,但我想我的问题与我的问题相比过于笼统.

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

更新2

我意识到以上信息专门针对我的应用程序,但我也在寻找一般性的建议.因此,如果使用线程是一个选项,请告诉我一般情况如何工作.如果另一个案例能够更好地工作,我需要做一些重新设计来实现它,也让我知道.只是在这里寻找建议.谢谢.

Shi*_*mar 1

迈克从外观上看,您已经满足了我认为所需要的要求,并且您应该在主应用程序域和辅助应用程序域中的类之间使用观察者模式。

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

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

那有意义吗?