2

Windows サービスとそのための MSI インストーラー (セットアップ プロジェクト) があります。セットアップ プロジェクトには、それぞれ /install と /uninstall の引数を持つインストールとアンインストールのカスタム アクションがあります。

インストール後すぐにサービスを開始したい。私のサービスはプロセスを開始するだけです。サービスが停止すると、process.Close();.

私はやってみました

var sc = new ServiceController( "MyProcess" );
sc.Start();

プロセスは開始されますが、サービスが開始されたことを示すイベント ログ メッセージは表示されません。停止するとエラーが発生しますError stopping process: System.InvalidOperationException: No process is associated with this object.

サービス コントローラーを使用せずに Services.msc を開始して使用すると、停止時に期待どおりに動作します。

プロセスをすぐに開始し、開始/停止メソッドを期待どおりに機能させる方法はありますか?

4

3 に答える 3

1

使用しているオペレーティング システムについては言及されていませんが、昨年、インストーラー アプリを開発しているときに、この問題に遭遇したことを覚えています。これは、Windows 7、Server 2003/2008、およびおそらく Vista のセキュリティ上の制限であると思います。インストール プログラムは、インストールするアプリケーション プログラムを起動できないからです。サービスを自動スタートアップに設定すると、システムの次回の再起動時にサービスが開始されます。

于 2010-02-11T21:36:18.177 に答える
0

あなたが言っていることは、ここで2つの問題が起こっているということだと思います. 最初の問題は、インストール時にサービスが開始されないことです。2 つ目は、サービスがプロセスを開始できないことです。私は正しいですか?

セットアップ プロジェクトを通じてサービスをインストールしたときは、常にインストーラー クラスの Commit メソッドからサービスを開始します。これにより、すべてが正しくインストールされたことを確認できます。これについて 100% 確信があるわけではありませんが、インストールがコミットされるまでサービスを開始できない可能性があります。カスタム アクションが正しく設定されているように見えるので、Commit メソッドが呼び出されても問題はないはずです (カスタム アクションに Commit が含まれていますよね?)。私のプロジェクトの:

public override void Commit(IDictionary savedState)
{
    base.Commit(savedState);

    try
    {
        var serviceController = new ServiceController("<Insert Service Name>");
        serviceController.Start();
    }
    catch
    {
        MessageBox.Show(
            "There was an error starting the <Insert Service Name> Service. Please manually start it, or restart the computer.");
    }
}

ユーザーにメッセージ ボックスを表示することで、サービスの開始に問題が発生した場合、少なくともサービスを手動で開始する必要があることがユーザーに通知されます。インストールの問題をデバッグするときは、メッセージ ボックスに例外を含めて、正確に何が起こっているのかを詳しく知ることができます。

興味があります - ServiceProcessInstaller でどのアカウントを使用していますか? このユーザーは、コンピュータ上でプロセスを開始する権限を持っていますか? プロセスには特定の UAC 要件がありますか? アクセス制御がプロセスの開始を妨げていると思われます。

于 2010-02-11T23:36:28.340 に答える
0

以前に開始したプロセスを保持しようとするのではなく、実行中のプロセスを取得するだけで、別のアプローチを取ることになりました。プロセスの停止は問題なく機能し、OnStart/OnStop メソッドが「適切に」機能していることは問題ではありません。これは、内部プロセスが必要に応じて開始/停止しているためです。

于 2010-02-12T20:03:26.280 に答える