web-dev-qa-db-ja.com

Visual Studioで作成されたWindowsサービスをインストールする

Visual Studio 2010で新しいWindowsサービスを作成すると、InstallUtilとnet startを使用してサービスを実行することを示すメッセージが表示されます。

次の手順を試しました。

  1. 新規プロジェクトの作成ファイル->新規->プロジェクト-> Windowsサービス
  2. プロジェクト名:TestService
  3. プロジェクトをそのままビルド(Service1コンストラクター、OnStart、OnStop)
  4. コマンドプロンプトを開き、"C:\ Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" TestService.exeを実行します
  5. net start TestServiceを実行します。

ステップ4の出力

トランザクションインストールの実行。

インストールのインストールフェーズの開始。

C:\ Users\myusername\Documents\Visual Studio 2010\Projects\TestService\TestService\obj\x86\Debug\TestService.exeアセンブリの進行状況については、ログファイルの内容を参照してください。

ファイルはC:\ Users\myusername\Documents\Visual Studio 2010\Projects\Tes tService\TestService\obj\x86\Debug\TestService.InstallLogにあります。

アセンブリ 'C:\ Users\myusername\Documents\Visual Studio 2010\Projects\TestS ervice\TestService\obj\x86\Debug\TestService.exeをインストールしています。

影響を受けるパラメーターは次のとおりです。

logtoconsole =

ログファイル= C:\ Users\myusername\Documents\Visual Studio 2010\Projects\TestService\T estService\obj\x86\Debug\TestService.InstallLog

assemblypath = C:\ Users\myusername\Documents\Visual Studio 2010\Projects\TestServ ice\TestService\obj\x86\Debug\TestService.exe

RunInstallerAttribute.Yes属性を持つパブリックインストーラーは、C:\ Users\myusername\Documents\Visual Studio 2010\Projects\TestService\TestSe rvice\obj\x86\Debug\TestService.exeアセンブリに見つかりませんでした。

インストールフェーズが正常に完了し、コミットフェーズが開始されています。

C:\ Users\myusername\Documents\Visual Studio 2010\Projects\TestService\TestService\obj\x86\Debug\TestService.exeアセンブリの進行状況については、ログファイルの内容を参照してください。

ファイルはC:\ Users\myusername\Documents\Visual Studio 2010\Projects\Tes tService\TestService\obj\x86\Debug\TestService.InstallLogにあります。

アセンブリ 'C:\ Users\myusername\Documents\Visual Studio 2010\Projects\TestS ervice\TestService\obj\x86\Debug\TestService.exeをコミットしています。

影響を受けるパラメーターは次のとおりです。

logtoconsole =

ログファイル= C:\ Users\myusername\Documents\Visual Studio 2010\Projects\TestService\T estService\obj\x86\Debug\TestService.InstallLog

assemblypath = C:\ Users\myusername\Documents\Visual Studio 2010\Projects\TestServ ice\TestService\obj\x86\Debug\TestService.exe

RunInstallerAttribute.Yes属性を持つパブリックインストーラーは、C:\ Users\myusername\Documents\Visual Studio 2010\Projects\TestService\TestSe rvice\obj\x86\Debug\TestService.exeアセンブリに見つかりませんでした。

インストーラーがないため、InstallStateファイルを削除します。

コミットフェーズが正常に完了しました。

トランザクションインストールが完了しました。

ステップ5の出力

サービス名が無効です。

NET HELPMSG 2185と入力すると、さらにヘルプが利用できます。

129
jkh

デザイナーでService.csファイルを開き、右クリックして、メニューオプション[インストーラーの追加]を選択する必要があります。

すぐにインストールされるわけではありません...最初にインストーラークラスを作成する必要があります。

サービスインストーラーの参照:

方法:インストーラーをサービスアプリケーションに追加する

かなり古い...しかし、これは私が話していることです:

C#のWindowsサービス:インストーラーの追加(パート3)

これにより、ProjectInstaller.csが自動的に作成されます。次に、これをダブルクリックしてデザイナーを入力し、コンポーネントを構成できます。

  • serviceInstaller1には、サービス自体のプロパティがあります。DescriptionDisplayNameServiceName、およびStartTypeが最も重要です。

  • serviceProcessInstaller1には、次の重要なプロパティがあります。Accountは、サービスを実行するアカウントです。

例えば:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;
229
Miguel Angelo

見つめている:

RunInstallerAttribute.Yes属性を持つパブリックインストーラーは、C:\ Users\myusername\Documents\Visual Studio 2010\Projects\TestService\TestSe rvice\obj\x86\Debug\TestService.exeアセンブリに見つかりませんでした。

コードにインストーラークラスがない可能性があります。これはInstallerを継承するクラスで、installutilにサービスとして実行可能ファイルをインストールする方法を指示します。

追伸ここには、コードをコピーまたは使用できる、自己インストール/デバッグ可能なWindowsサービステンプレートがあります。 デバッグ可能、自己インストールWindowsサービス

11

インストーラを作成し、そのエラーメッセージを取り除く別の方法を次に示します。また、VS2015 Expressには「Add Installer」メニュー項目がないようです。

クラスを作成し、以下のコードを追加し、参照System.Configuration.Install.dllを追加するだけです。

using System.Configuration.Install;
using System.ServiceProcess;
using System.ComponentModel;


namespace SAS
{
    [RunInstaller(true)]
    public class MyProjectInstaller : Installer
    {
        private ServiceInstaller serviceInstaller1;
        private ServiceProcessInstaller processInstaller;

        public MyProjectInstaller()
        {
            // Instantiate installer for process and service.
            processInstaller = new ServiceProcessInstaller();
            serviceInstaller1 = new ServiceInstaller();

            // The service runs under the system account.
            processInstaller.Account = ServiceAccount.LocalSystem;

            // The service is started manually.
            serviceInstaller1.StartType = ServiceStartMode.Manual;

            // ServiceName must equal those on ServiceBase derived classes.
            serviceInstaller1.ServiceName = "SAS Service";

            // Add installer to collection. Order is not important if more than one service.
            Installers.Add(serviceInstaller1);
            Installers.Add(processInstaller);
        }
    }
}
8
Carol

2つの典型的な問題:

  1. ProjectInstallerクラスがありません(@MiguelAngeloが指摘したように)
  2. コマンドプロンプトは「管理者として実行」する必要があります
4

別の考えられる問題(私が遭遇した):

ProjectInstallerクラスがpublicであることを確認してください。正直に言って、私はそれを正確にどのように行ったかはわかりませんが、次のようにイベントハンドラをProjectInstaller.Designer.csに追加しました。

this.serviceProcessInstaller1.BeforeInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_BeforeInstall);

ProjectInstaller.csでハンドラー関数を作成する自動プロセス中に、クラス定義が

public class ProjectInstaller : System.Configuration.Install.Installer

partial class ProjectInstaller : System.Configuration.Install.Installer

置き換えpublicキーワードとpartial。だから、それを修正するためには

public partial class ProjectInstaller : System.Configuration.Install.Installer

Visual Studio 2013 Communityエディションを使用しています。

3
John Archer

VS 2010および.NET 4.0以降のステルス変更

RunInstallerAttribute.Yes属性を持つパブリックインストーラーが見つかりませんでした

.NETにはエイリアスの変更またはコンパイラのクリーンアップがあり、特定のケースでこの小さな調整が明らかになる場合があります。

次のコードがある場合は…

RunInstaller(true)   // old alias  

更新する必要があるかもしれません

RunInstallerAttribute(true)  // new property spelling

これは、コンパイル時または実行時にカバーの下で変更されたエイリアスのようなもので、このエラー動作が発生します。上記のRunInstallerAttribute(true)に対する明示的な変更により、すべてのマシンでのすべてのインストールシナリオで修正されました。

プロジェクトまたはサービスインストーラーを追加した後、「古い」RunInstaller(true)を確認し、新しいRunInstallerAttribute(true)に変更します

1
Sql Surfer

さらに別の落とし穴:インストーラー派生クラス(通常ProjectInstaller)が名前空間階層の最上位にあることを確認し、別のパブリッククラス内でパブリッククラスを使用しようとしましたが、同じ古いエラーが発生します:

RunInstallerAttribute.Yes属性を持つパブリックインストーラーは見つかりませんでした

1
Phlash