1

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 アプリケーションに接続されているプロセスを見つけて、プログラムで強制終了することです。このソリューションの方が優れている場合、どうすればそれを達成できますか? ありがとうございました。

4

1 に答える 1

0

サービスをアンインストールした場合、例外が発生する可能性が高いと思います..例外を処理する必要があります。他のオプションは、サービスからUIへの何らかの形式のアンインストール通知のみですが、それは非常に複雑に思えます。例外を処理し、リソースを整理するだけです

于 2012-05-22T10:43:57.773 に答える