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

本文关键字:两个 应用程序 协商 | 更新日期: 2023-09-27 18:10:39

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

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

您可以对这种IPC使用命名管道。为此,请查看System.IO.Pipes名称空间和优秀的NamedsPipeServerStream &NamedPipeClientStream类。

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

这是可能的。这在。net类型中的支持程度取决于你如何确定"已崩溃"。

基本上,监视应用程序需要提供适合访问应该运行被监视应用程序的系统的凭据。这就是将文件从另一个域复制到/从另一个域所做的事情,以如下开头:
net use ''Fileserver1.domain2.com'IPC$ /user:DOMAIN'USER PASSWORD

或与之等价的API

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

您可以使用AppDomain.UnhandledException事件向另一个AppDomain发送信号,可能是通过一个命名的互斥锁。因为它们是系统范围的,你可以创建一个名为"myapphascrash"的并立即锁定它。当遇到未处理的异常时,释放互斥锁。另一方面,有一个等待互斥锁的线程。由于它最初是阻塞的,线程将等待。当发生异常时,线程恢复,您可以处理崩溃。

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,但它可以很好地用于域间和进程间的情况。