2011-10-05 46 views
4

如何通知處於不同域中的當前正在運行的應用程序崩潰的另一個應用程序?換句話說, ,是否可以在不同的域中協商兩個不同的應用程序?在不同域中協商兩個應用程序

在此先感謝。

回答

3

您可以對這種IPC使用命名管道。爲此,請查看System.IO.Pipe的名稱空間和優秀的NamedsPipeServerStream & NamedPipeClientStream類。

請注意,您可以在同一個域內使用匿名管道進行進程間通信,同時您可以在不同域(即跨同一個Intranet上的PC)中使用IPC的命名管道。

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. 
} 

這是一個黑客攻擊的一位,但它工作得很好兩個域間和進程間的情況。

+1

「跨域」是指不同的計算機:互斥鎖是特定於一臺計算機的。 – Richard

+0

@Richard - 對不起,我們以爲只是在一臺機器上處理AppDomain。 – Polynomial

+1

我錯過閱讀的問題的數量,因此回答錯誤的問題是令人尷尬的大問題......我們都做到了。 – Richard

1

是的,這是可能的。 .NET類型支持的情況會有所不同,具體取決於您如何確定「已崩潰」。

基本上,監控應用程序需要提供適合訪問應該運行受監控應用程序的系統的證書。這正是一個會做與something like啓動文件到/從另一個域複製:

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

或它的API equaivalent。

如果使用WMI(這是顯而易見的方法,很容易與Win32_Process查詢列出遠程系統上的進程),你可以提供憑據(例如,與scripting interfacein .NET)。

相關問題