Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET代理/加载程序应用程序体系结构_.net_Appdomain - Fatal编程技术网

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

.NET代理/加载程序应用程序体系结构,.net,appdomain,.net,Appdomain,我想在第二个AppDomain中从“loader”类启动一个WPF应用程序。如果WPF应用程序自身超时,我希望它向loader类触发一个事件,loader类将卸载第二个AppDomain并显示一个登录屏幕。如果用户重新登录,将重复相同的过程 我通过以下方式获得了一定程度的工作经验: Loader类通过CreateInstanceAndUnwrap在该域中创建第二个AppDomain和类B Loader类创建一个具有超时事件的MarshallByRefObject,并将其传递给B.StartUpM

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

我通过以下方式获得了一定程度的工作经验:

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

Loader类创建一个具有超时事件的MarshallByRefObject,并将其传递给B.StartUpMBRO,B.StartUpMBRO将MBRO传递给WPF应用程序的构造函数。Loader类向MBRO.Timeout添加一个处理程序

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

问题是我无法在步骤3中卸载第二个AppDomain。当我这样做的时候,它会关闭主机appdomain,没有异常或任何事情,整个过程都会关闭

我认为问题的发生是因为事件处理程序委托正由第二个域中的WPF应用程序触发,因此我试图从它已触发的委托中从应用程序域下拉出rug

这是正确的吗?它跨域工作时是这样的吗


总之,有谁能建议一种方法,让您可以启动第二个AppDomain,从第二个AppDomain接收事件,并在收到该事件后卸载第二个AppDomain?我想我需要有人将事件的接收与卸载应用程序域的行为分离。

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

你有几个选择

你调用应用程序域。如果您可以使调用的方法返回一个特定的状态代码,例如Success或Timeout,那么您就不再有堆栈问题

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

从第一个线程开始,创建一个新线程,该线程创建应用程序域并启动应用程序

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

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

主线程将唤醒,并根据标志的状态知道要做什么


非常感谢。我将对此进行试验,并向您汇报。在实践中,我决定给我的B类报告一个超时,以便加载程序可以终止它,相反,我要让B关闭它自己。