C# で記述された .net アプリケーションがあります。このアプリケーションは、c++ で記述された親アプリケーションから呼び出されます。親アプリケーションがクラッシュしたり誤って閉じたりしても、.net アプリケーションは引き続き実行されます。しかし、親アプリケーションがクラッシュまたは停止したときに、クライアント アプリケーションも閉じたいと考えています。
私の同僚の 1 人は、シングルトン クラスを使用してこれを簡単に実装できると言いました。どうやってやるの?
C# で記述された .net アプリケーションがあります。このアプリケーションは、c++ で記述された親アプリケーションから呼び出されます。親アプリケーションがクラッシュしたり誤って閉じたりしても、.net アプリケーションは引き続き実行されます。しかし、親アプリケーションがクラッシュまたは停止したときに、クライアント アプリケーションも閉じたいと考えています。
私の同僚の 1 人は、シングルトン クラスを使用してこれを簡単に実装できると言いました。どうやってやるの?
親アプリケーションがまだ実行されているかどうかを確認するには、ポーリングする必要があります。
これを行う 1 つの方法は、Windows で監査プロセスの追跡を構成することにより、アプリケーションがいつ実行されたかを設定することです。次のリンクから始めることができます。
プロセスの追跡により、Windows イベント ログにエントリが作成され、C++、C#、および/または VB.Net を使用してアクセスできます。これらのログを使用して、親アプリケーションが実行されているかどうかを確認できます。
編集:
C++ コードベースにアクセスできる場合は、親アプリがクラッシュまたは終了したときに例外をキャッチしようとすることができます。次に例を示します。
Application.ThreadException += new ThreadExceptionEventHandler(ApplicationThreadException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(ApplicationUnhandledException);
private void ApplicationThreadException(object sender, ThreadExceptionEventArgs e)
{
//Write to a File, Registry, Database flagging the application has crashed
}
private void ApplicationUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
//Write to a File, Registry, Database flagging the application has crashed
}
private void frmMain_FormClosed(object sender, FormClosedEventArgs e)
{
//Write to a File, Registry, Database flagging the application has closed
}
それ以外の場合は、親アプリケーションが Process Manager にリストされているかどうかを確認するためにポーリングする必要があります。次に例を示します。
StringBuilder sb = new StringBuilder();
ManagementClass MgmtClass = new ManagementClass("Win32_Process");
foreach (ManagementObject mo in MgmtClass.GetInstances())
{
sb.Append("Name:\t" + mo["Name"] + Environment.NewLine);
sb.Append("ID:\t" + mo["ProcessId"] + Environment.NewLine);
sb.Append(Environment.NewLine);
}
リストされていない場合は、子アプリケーションを閉じます。
まず、親ウィンドウが例外または終了を発生させたときにイベントをキャッチする必要があります。次に、親ウィンドウによって既に起動されているプロセスに終了メッセージを送信します。閉じるメッセージの送信に関する情報については、ここを参照してください: Windows プロセスにメッセージを送信します (メイン ウィンドウではありません)。
または