在不同的域中协商两个应用程序

时间:2011-10-05 07:59:26

标签: c# .net winforms applicationdomain

如何通知当前正在运行的应用程序崩溃的另一个域中的另一个应用程序? 换句话说,是否可以在单独的域中协商两个不同的应用程序?

提前致谢。

3 个答案:

答案 0 :(得分:3)

您可以将命名管道用于此类IPC。为此,请查看System.IO.Pipe的命名空间和优秀的NamedsPipeServerStream& NamedPipeClientStream课程。

请注意,您只能将匿名管道用于同一域内的进程间通信,而您可以在单独的域中(即在同一Intranet上的PC之间)使用IPC的命名管道。

答案 1 :(得分:1)

是的,这是可能的。 .NET类型支持的程度将取决于您如何确定“已崩溃”。

基本上,监控应用程序需要提供适合访问应运行受监控应用程序的系统的凭据。这正是从something like

开始,将文件复制到另一个域或从另一个域复制文件的方法
net use \\Fileserver1.domain2.com\IPC$ /user:DOMAIN\USER PASSWORD

或其API等价。

如果您使用WMI(这是一种显而易见的方法,很容易列出具有查询Win32_Process的远程系统上的进程),您可以提供凭据(例如,使用scripting interfacein .NET)。

答案 2 :(得分:0)

您可以使用AppDomain.UnhandledException事件来通知其他AppDomain,可能是通过命名的Mutex。由于它们是系统范围的,因此您可以创建一个名为“MyAppHasCrashed”并立即锁定它。当您遇到未处理的异常时,会释放互斥锁。另一方面,有一个等待互斥锁的线程。由于它最初被阻止,线程将等待。发生异常时,线程会恢复,您可以处理崩溃。

Mutex crashed = new Mutex(true, "AppDomain1_Crashed");
...
private void AppDomain_UnhandledException(...)
{
    // do whatever you want to log / alert the user
    // then unlock the mutex
    crashed.ReleaseMutex();
}

然后,在另一边:

void CrashWaitThread()
{
    try {
        crashed = Mutex.OpenExisting("AppDomain1_Crashed");
    }
    catch (WaitHandleCannotBeOpenedException)
    {
        // couldn't open the mutex
    }
    crashed.WaitOne();
    // code to handle the crash here.
}

这有点像黑客,但它适用于域间和进程间的情况。