Windows サービスと制御 GUI で構成される既存の .NET アプリケーション (C#) を継承しました。GUI アプリケーション、サービス、およびセットアップ プロジェクトは、vs2010 ソリューションに組み込まれています。GUI は、静的なメイン クラスによって起動される Windows フォームです。これは、最小化されたときにトレイに常駐する必要があるためです。GUI にはタイマーがあり、サービスがアクティブかどうかを定期的にチェックし、それに応じてポップアップ メニューの [サービスの開始] および [サービスの停止] エントリを有効/無効にします。問題は、アンインストールしようとすると、GUI の前にサービスが削除され、サービスが見つからないために GUI の timer_Tick が例外をスローすることです。メイン クラスがアプリケーションを起動するために使用するコードは次のとおりです。
static class Program
{
/// <summary>
/// Punto di ingresso principale dell'applicazione.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
}
タイマーによって実行されるコード (try/catch ブロックは、例外をキャッチするために私が追加したものです):
private void tmrCheckService_Tick(object sender, EventArgs e)
{
try
{
ServiceController service = new ServiceController("MyService");
if (service.Status == ServiceControllerStatus.Running)
{
startToolStripMenuItem.Enabled = false;
}
else
{
startToolStripMenuItem.Enabled = true;
}
service = null;
}
catch (InvalidOperationException oEx)
{
//tmrCheckService.Stop();
//this.Close();
}
}
catch ブロック内のコードのコメントを外すと、アプリケーションは終了し、アンインストールは成功します。これがエラーを管理する最善の方法であるかどうかはわかりません。アンインストール プロセスを管理して、サービスが削除される前に GUI を停止して削除したいのですが、それを行う方法が見つかりません。私が考えた可能な解決策は、サービス インストーラーの on beforeuninstall メソッドをオーバーライドし、GUI アプリケーションに接続されているプロセスを見つけて、プログラムで強制終了することです。このソリューションの方が優れている場合、どうすればそれを達成できますか? ありがとうございました。