繁体   English   中英

.NET代理/加载器应用程序体系结构

[英].NET proxy/loader application architecture

我想从“加载程序”类的第二个AppDomain中启动WPF应用程序。 如果WPF应用程序自身超时,我希望它将一个事件触发回loader类,并且loader类将Unload()第二个AppDomain并显示登录屏幕。 如果用户重新登录,将重复相同的过程。

我通过以下方式在某种程度上进行了工作:

  1. 加载程序类通过CreateInstanceAndUnwrap在该域中创建第二个AppDomain和类B。

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

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

问题是我无法在步骤3中卸载第二个AppDomain。执行此操作时,它也会同时关闭主机appdomain(没有异常或任何事情,整个事情都会关闭)。

我认为发生问题是因为事件处理程序委托由第二域中的WPF App触发,因此我试图从触发的委托中将其从App Domain下拉下。

这个对吗? 它在整个域中都这样工作吗?

总而言之,有人可以提出一种方法来启动第二个AppDomain,从第二个AppDomain接收事件并在接收到该事件后对第二个AppDomain进行Unload()吗? 我认为我需要有人将事件的接收与卸载应用程序域的行为脱钩。

是的,这是正确的。 问题是堆栈跟踪从主域穿过第二个域,然后又回到主域。

您在这里有几种选择。

  1. 您调用应用程序域。 如果可以使调用的方法返回特定的状态代码(例如SuccessTimeout ),则不再有堆栈问题;

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

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

    2. 仍然在第一个线程中,创建一个AutoResetEvent并在其上执行一个WaitOne()

    3. 从应用程序域执行事件时,它将不会在第一个线程上执行。 我不确定该事件是否将在第二个事件上执行,如果不是,则不需要创建辅助线程。 从线程进入,在某个地方设置“ Timeout”标志,并在事件上执行Set()

    4. 主线程唤醒并根据标志的状态知道该怎么做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM