.NET代理/加载器应用程序架构

时间:2010-10-29 04:44:05

标签: .net appdomain

我想从'loader'类在第二个AppDomain中启动WPF应用程序。如果WPF应用程序自行计时,我希望它将事件激活回加载器类,并且加载器类将卸载()第二个AppDomain并显示登录屏幕。如果用户重新登录,则会重复相同的过程。

我通过以下方式开展工作:

  1. Loader类通过CreateInstanceAndUnwrap在该域中创建第二个AppDomain和B类。

  2. Loader类创建一个具有Timeout事件的MarshalByRefObject,并将其传递给B.StartUp(MBRO),它将MBRO传递给WPF App()的构造函数。 Loader类为MBRO.Timeout添加处理程序。

  3. WPF App超时,调用MBRO.Timeout,由Loader类处理。在事件处理程序中,Loader类关闭B WPF App并显示登录窗口。

  4. 问题是我无法在第3步中卸载第二个AppDomain。当我这样做时,它也会关闭主机appdomain(没有例外或任何事情,整个事情都会关闭)。

    我认为问题的发生是因为事件处理程序委托是由第二个域中的WPF应用程序触发的,因此我试图从它已经解雇的委托中从App Domain下取出地毯。

    这是对的吗?它是否在域之间如此工作?

    总之,有人可以建议一种方法,你可以启动第二个AppDomain,从第二个AppDomain接收事件,并在收到该事件后卸载()第二个AppDomain吗?我想我需要有人将事件的收据与卸载应用域的行为分开。

1 个答案:

答案 0 :(得分:0)

是的,这是正确的。问题是堆栈跟踪从主域传递到第二个域并返回主域。

你在这里有几个选择。

  1. 您呼入应用域。如果你可以这样做,以便你调用的方法返回一个特定的状态代码(例如SuccessTimeout),你就不再有堆栈问题了;

  2. 您从第二个帖子调用应用程序域:

    1. 从第一个帖子中,创建一个新线程,创建应用程序域并启动应用程序;

    2. 仍然在第一个帖子中,创建一个AutoResetEvent并对其进行WaitOne();

    3. 当从app域执行事件时,它不会在第一个线程上执行。我不确定事件是否会在第二个事件上执行,如果不是,则不需要创建辅助线程。从进入的线程开始,在某处设置'Timeout'标志并对事件进行Set();

    4. 主要线程醒来并知道该怎么做,具体取决于标志的状态。