我想从'loader'类在第二个AppDomain中启动WPF应用程序。如果WPF应用程序自行计时,我希望它将事件激活回加载器类,并且加载器类将卸载()第二个AppDomain并显示登录屏幕。如果用户重新登录,则会重复相同的过程。
我通过以下方式开展工作:
Loader类通过CreateInstanceAndUnwrap在该域中创建第二个AppDomain和B类。
Loader类创建一个具有Timeout事件的MarshalByRefObject,并将其传递给B.StartUp(MBRO),它将MBRO传递给WPF App()的构造函数。 Loader类为MBRO.Timeout添加处理程序。
WPF App超时,调用MBRO.Timeout,由Loader类处理。在事件处理程序中,Loader类关闭B WPF App并显示登录窗口。
问题是我无法在第3步中卸载第二个AppDomain。当我这样做时,它也会关闭主机appdomain(没有例外或任何事情,整个事情都会关闭)。
我认为问题的发生是因为事件处理程序委托是由第二个域中的WPF应用程序触发的,因此我试图从它已经解雇的委托中从App Domain下取出地毯。
这是对的吗?它是否在域之间如此工作?
总之,有人可以建议一种方法,你可以启动第二个AppDomain,从第二个AppDomain接收事件,并在收到该事件后卸载()第二个AppDomain吗?我想我需要有人将事件的收据与卸载应用域的行为分开。
答案 0 :(得分:0)
是的,这是正确的。问题是堆栈跟踪从主域传递到第二个域并返回主域。
你在这里有几个选择。
您呼入应用域。如果你可以这样做,以便你调用的方法返回一个特定的状态代码(例如Success
或Timeout
),你就不再有堆栈问题了;
您从第二个帖子调用应用程序域:
从第一个帖子中,创建一个新线程,创建应用程序域并启动应用程序;
仍然在第一个帖子中,创建一个AutoResetEvent
并对其进行WaitOne()
;
当从app域执行事件时,它不会在第一个线程上执行。我不确定事件是否会在第二个事件上执行,如果不是,则不需要创建辅助线程。从进入的线程开始,在某处设置'Timeout'标志并对事件进行Set()
;
主要线程醒来并知道该怎么做,具体取决于标志的状态。