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

问题描述:

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

在此先感谢。

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

请注意,您可以在同一个域内使用匿名管道进行进程间通信,同时您可以在不同域(即跨同一个Intranet上的PC)中使用IPC的命名管道。

您可以使用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. 
} 

这是一个黑客攻击的一位,但它工作得很好两个域间和进程间的情况。

+1

“跨域”是指不同的计算机:互斥锁是特定于一台计算机的。 – Richard

+0

@Richard - 对不起,我们以为只是在一台机器上处理AppDomain。 – Polynomial

+1

我错过阅读的问题的数量,因此回答错误的问题是令人尴尬的大问题......我们都做到了。 – Richard

是的,这是可能的。 .NET类型支持的情况会有所不同,具体取决于您如何确定“已崩溃”。

基本上,监控应用程序需要提供适合访问应该运行受监控应用程序的系统的证书。这正是一个会做与something like启动文件到/从另一个域复制:

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

或它的API equaivalent。

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