4

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

提前致谢。

4

3 回答 3

3

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

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

于 2011-10-05T08:05:25.813 回答
1

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

基本上,监控应用程序需要提供适合访问应该运行被监控应用程序的系统的凭据。这正是从以下内容开始将文件复制到另一个域/从另一个域复制文件的方法

net use \\Fileserver1.domain2.com\IPC$ /user:DOMAIN\USER PASSWORD

或其 API 等效项。

如果您使用 WMI(这是显而易见的方法,很容易通过查询列出远程系统上的进程Win32_Process),您可以提供凭据(例如,使用脚本接口在 .NET 中)。

于 2011-10-05T08:09:50.350 回答
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.
}

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

于 2011-10-05T08:07:17.470 回答