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

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

私は次のステップを試しました:

  1. Create new project File -> New -> Project -> Windows Service
  2. Project Name: TestService
  3. Build project as is (Service1 constructor, OnStart, OnStop)
  4. Open command prompt, run "C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" TestService.exe
  5. Run 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 \ TestServlet \ TestService \ obj \ x86 \ Debug \ TestService.exe 'になります。

     

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

     

logtoconsole =

     

logfile = 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 \ TestServlet \ TestService \ obj \ x86 \ Debug \ TestService.exe 'になります。

     

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

     

logtoconsole =

     

logfile = 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を入力すると、より多くのヘルプが利用できます。

117

6 答え

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

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

サービスインストーラに関する参考情報:

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

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

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

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

    ServiceNameServiceInstaller1 は、サービス自体のプロパティを持ちます。 code> StartType が最も重要です。
  • serviceProcessInstaller1 には、サービスが実行されるアカウントである Account という重要なプロパティがあります。

例えば:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;
215
追加された
私はVS2013で同じエラーが発生しています。あなたが提供したリンクを確認し、正しく構成されたコンポーネントサービス[プロセス] Installer1を含むProjectInstallerがあることを確認しました。私は管理者としてinstallutil.exeを実行します。それでも「RunInstallerAttribute.Yes属性を持つパブリック・インストーラーは見つかりません」と報告されます。何か案は?
追加された 著者 Barry Dysert,
笑。私は、 "かなり古い"リンクがArcane Codeというサイトにあることを愛しています。そのページが古くなるほど、その名前はより真実になります:-)
追加された 著者 HotN,
インストーラを追加し、LocalSystemにアカウントを設定してください。ありがとう!
追加された 著者 Luc,

見つめている:

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

あなたのコードにインストーラクラスがないようです。これは installer から継承するクラスで、 installutil に実行可能ファイルをサービスとしてインストールする方法を教えてくれます。

P.s. I have my own little self-installing/debuggable Windows Service template here which you can copy code from or use: Debuggable, Self-Installing Windows Service

11
追加された
Visual Studio - >プロパティ - >サービスでTestServiceプロジェクトを右クリックすると、ページが無効になります...別の場所を参照していましたか?アプリケーションでは、アセンブリ名はTestServiceです。
追加された 著者 jkh,
@ジョン:サービスコンソールの最初の部分は無視し、実際にはで始まる2番目の部分を見てください。インストーラが見つからなかったため、サービスがインストールされなかったようです。
追加された 著者 James Michael Hare,

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

クラスを作成し、以下のコードを追加して参照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
追加された
VS2015を実行しても、このソリューションでは、以前に取得していた「RunInstallerAttribute.Yesのパブリックインストーラなし」というエラーメッセージが表示されました。ありがとうございました!
追加された 著者 PHBeagle,

もう一つの可能​​な問題(私が遭遇した):

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

this.serviceProcessInstaller1.BeforeInstall + =新しいSystem.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_BeforeInstall);

私は、 ProjectInstaller.cs にハンドラ関数を作成するという自動化プロセスの間に、クラス定義を

public class ProjectInstaller:System.Configuration.Install.Installer

partialクラスProjectInstaller:System.Configuration.Install.Installer

replacing the public keyword with partial. So, in order に fix it it must be

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

私はVisual Studio 2013 Community Editionを使用しています。

3
追加された

2つの典型的な問題:

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

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

No public installers with the RunInstallerAttribute.Yes attribute could be found

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

あなたは次のコードを持っている場合...

RunInstaller(true)  //old alias  

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

RunInstallerAttribute(true) //new property spelling

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

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

1
追加された
私の知る限りでは、「属性」接尾辞、つまり[RunInstaller(true)]と[RunInstallerAttribute(true)]は同じではありません。別の属性で試してみてください。 [DebuggerStepThrough()]と[DebuggerStepThroughAttribute()] - どちらもクラスに適用すると動作します。
追加された 著者 Matt,