1

コンテクスト

Windows200864ビット。
インストーラーとして機能する.NETサービスをインストールしています。

バックグラウンド

私はこのコード(クレジット:Marc Gravell)を使用してサービスをインストールしています:

using (var inst = new AssemblyInstaller(typeof(MyNamespace.Program).Assembly, new string[] { })) {
    IDictionary state = new Hashtable();
    inst.UseNewContext = true;
    try {
    if (uninstall) {
        inst.Uninstall(state);
    } else {
        inst.Install(state);
        inst.Commit(state);
    }
    } catch {
    try {
        inst.Rollback(state);
    } catch { }
    throw;
    }
}

問題

すべて正常に動作し、例外はありませんが、その直後に、次のコードを実行して、インストールしたばかりのサービスを開始しようとしています。

using (var sc = new ServiceController("the service's name"))
{
    sc.Start();
    sc.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(20));
}

そして、私は例外を受け取ります:

System.InvalidOperationException:サービス[サービス名はここにあります]がコンピューター'。'で見つかりませんでした。---> System.ComponentModel.Win32Exception:指定されたサービスはインストールされたサービスとして存在しません
   ---内部例外スタックトレースの終わり---
   System.ServiceProcess.ServiceController.GenerateNames()で
   System.ServiceProcess.ServiceController.get_ServiceName()で
   System.ServiceProcess.ServiceController.Start(String [] args)で
   System.ServiceProcess.ServiceController.Start()で
   at ...(私のコードの詳細)

理由がわかりません。理由は次のとおりです。

  1. ServiceInstallerサービスの名前は、 (ServiceNameプロパティ内の)とまったく同じです。
  2. コードは、ローカルシステムアカウントで実行される別のサービス内で実行され ます。
4

2 に答える 2

0

役立つインストール ログがあります。YouServiceName.InstallLogサービスのフォルダーでファイルを探します。

サービスのインストーラーを追加するだけで十分かもしれません (私にとってはそうでした)。あなたがすべき:

  • デザイナーで Service.cs ファイルを開き、
  • それを右クリックして、
  • メニューオプション「インストーラーの追加」を選択します。

箱から出してすぐにはインストールされません...最初にインストーラークラスを作成する必要があります。

参考までに、この質問も参照してください。

于 2016-07-15T19:50:11.263 に答える
0

サービスが待機状態でスタックしており、完全な登録がまだ完了していないため、インストールされたサービスとして認識されていない可能性があります。
プロパティを設定UseNewContextすると、インストール ログ ファイル ("{アセンブリ名}.InstallLog") に意味のある情報が含まれていますか?
また、これがアクセス許可の問題であるかどうかを確認するには、次を使用してサービスの存在を確認してみてください。

sc query <ServiceName>

管理コマンド ウィンドウから?

于 2014-10-02T06:43:02.600 に答える