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


136

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と入力すると、さらにヘルプが表示されます。

回答:


243

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

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

サービスインストーラに関する参考資料:

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

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

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

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

  • serviceInstaller1サービス自体の性質を有する:DescriptionDisplayNameServiceNameそしてStartType最も重要なのです。

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

例えば:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;

3
インストーラーを追加し、アカウントをLocalSystemに設定することで実行されました。ありがとう!
Luc

1
VS2013でも同じエラーが発生します。提供されたリンクを確認し、ProjectServiceがコンポーネントサービス[Process] Installer1を含めて適切に構成されていることを確認しました。管理者としてinstallutil.exeを実行します。それでも、「RunInstallerAttribute.Yes属性を持つパブリックインストーラーは見つかりませんでした」と報告されます。何か案は?
Barry Dysert 14

4
笑。「かなり古い」リンクがArcane Codeと呼ばれるサイトへのリンクであることを気に入っています。そのページが古くなるほど、その名前はより真実になります:-)
HotN

「デザイナー」とは?UIを持たないアプリケーションには、通常、デザイナーと呼ばれるものは含まれていません。
Maxx 2019

サービスにもフォームと同じようにデザイナーがあります
Grungondola '17

11

見つめている:

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

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

Ps私はここに自分の小さな自己インストール/デバッグ可能なWindowsサービステンプレートがあり、そこからコードをコピーしたり使用したりできます:デバッグ可能、自己インストールWindowsサービス


Visual Studio->プロパティ->サービスでTestServiceプロジェクトを右クリックすると、ページが無効になります...別の場所を参照していましたか?アプリケーションの下で、アセンブリ名はTestServiceです。
jkh '27 / 10/27

@ジョン:サービスコンソールに関する最初の部分は無視してください。次の部分はActuallyで見てください。インストーラーが見つからなかったため、サービスがインストールされなかったようです。
James Michael Hare

8

インストーラーを作成してそのエラーメッセージを取り除く別の方法を次に示します。また、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);
        }
    }
}

VS2015とこのソリューションを実行すると、以前に取得していた「RunInstallerAttribute.Yesを使用したパブリックインストーラーがありません」というエラーメッセージが表示されなくなりました。ありがとうございました!
PHBeagle 2017年

6

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年後のことですが、これで問題は解決しました。なぜ、またはいつデザイナーが以前のパブリック部分クラスを内部部分クラスに変更したのかわからない。ありがとうございました!
ゴミ箱強盗

2

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

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

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

次のコードがある場合…

RunInstaller(true)   // old alias  

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

RunInstallerAttribute(true)  // new property spelling

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

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


私の知る限りでは、「属性」の接尾辞を省略できます。つまり、[RunInstaller(true)]と[RunInstallerAttribute(true)]は同じです。[DebuggerStepThrough()]や[DebuggerStepThroughAttribute()]など、別の属性で試してください。クラスに適用すると、どちらも機能します。
マット

1

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.