別のドメインにある別のアプリケーションに、現在実行中のアプリケーションがクラッシュしたことを通知するにはどうすればよいですか?言い換えれば、別々のドメインで2つの異なるアプリケーションをネゴシエートすることは可能ですか?
前もって感謝します。
別のドメインにある別のアプリケーションに、現在実行中のアプリケーションがクラッシュしたことを通知するにはどうすればよいですか?言い換えれば、別々のドメインで2つの異なるアプリケーションをネゴシエートすることは可能ですか?
前もって感謝します。
この種のIPCには名前付きパイプを使用できます。これについては、 System.IO.Pipeの名前空間とexcellent NamedsPipeServerStream
&NamedPipeClientStream
classesを調べてください。
匿名パイプは同じドメイン内のプロセス間通信にのみ使用できますが、IPCには別々のドメイン(つまり、同じイントラネット上のPC間)で名前付きパイプを使用できることに注意してください。
はい、可能です。これが.NETタイプでどの程度サポートされているかは、「クラッシュした」と判断する方法によって異なります。
基本的に、監視アプリケーションは、監視対象アプリケーションを実行する必要があるシステムにアクセスするのに適した資格情報を提供する必要があります。これは、次のようなものから始めて、別のドメインとの間でファイルをコピーするために行うこととまったく同じです。
net use \\Fileserver1.domain2.com\IPC$ /user:DOMAIN\USER PASSWORD
またはそのAPIと同等です。
WMIを使用する場合(これは明らかなアプローチであり、のクエリを使用してリモートシステム上のプロセスを一覧表示するのは簡単ですWin32_Process
)、資格情報を提供できます(たとえば、スクリプトインターフェイスまたは.NETを使用)。
イベントを使用してAppDomain.UnhandledException
、おそらく名前付きのMutexを介して他のAppDomainに信号を送ることができます。それらはシステム全体であるため、「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.
}
これはちょっとしたハックですが、ドメイン間とプロセス間の両方のケースでうまく機能します。