2009-05-03 17 views
24

私はさまざまなことをするためにいくつかのWindowsサービスを構築しようとしています。1つのexeで複数のWindowsサービス

  1. は、いくつかのアーカイブされた情報に電子メール
  2. 定期的にクリーンアップを経て、30分ごとに
  3. など

私は窓を必要とするタスクを毎日レポートを送信する:例えば、私はするWindowsサービスを必要としますサービスは別物なので、私はそれらをすべて1つのサービスにまとめるというアイデアは本当に好きではありません。

これまでVisual Studio 2008のプロジェクトがありました。Windowsサービスを作成しましたが、OnStartイベントでタイマーを設定しました(テキストファイルには5秒ごとに書き込みます)。テスト目的)。私はプロジェクトにインストーラを追加し、InstallUtil.exeを実行するとすべて正常に動作します。

同じプロジェクトに2つ目のWindowsサービスを追加すると問題が発生します。私はOnStartコードを同じロギング情報で再設定します(少し異なるので、どのサービスがログに書き込んでいるかを知ることができます)。

static void Main(string[] args) 
    { 
     ServiceBase[] ServicesToRun = new ServiceBase[] 
     { 
      new Service1() 
     }; 

     ServiceBase.Run(ServicesToRun); 
    } 

:第二の窓サービスで、私からのProgram.csでメインイベントを変更し、この時点で

static void Main(string[] args) 
    { 
     ServiceBase[] ServicesToRun = new ServiceBase[] 
     { 
      new Service1(), 
      new Service2() 
     }; 

     ServiceBase.Run(ServicesToRun); 
    } 

、そこにはコンパイル時のエラーはありませんが、サービス2サービスは行いません何か...ロギングタスクは決して起きません。

2番目のサービスに「インストーラー」が関連付けられていないという事実に絞りました。その後、最初のサービス(つまり、サービス・デザイナーを右クリックし、「インストーラーの追加」をクリック)と同じようにインストーラーを追加しようとしました。今、私がProjectInstaller.csファイルに行くと、そこに別のserviceInstaller(serviceInstaller2)があります。

Windowsの場合:私は、プロジェクトをビルドし、サービスをインストールしよう、と私は、「サービス」コントロールパネルウィンドウに移動し、私はサービス1を起動しようとすると

は今、私は、次のエラーメッセージが表示されますローカルコンピュータ上でService1サービスを開始できませんでした。

エラー1083:このサービスが実行するように構成されている実行可能プログラムは、サービスを実装していません。

私もService2を開始しようとするとエラーメッセージが表示されます(ただし、エラーメッセージがService2を識別する例外はあります)。

1つのexeから2つのサービスを実行するために欠けているものがありますか?

+0

ために見ることができるように、すべて等しいが、その値の前スペースを持っている必要があります「私がしたい」他よりも、特定の理由があります単一の実行可能ファイルにサービスが必要ですか?通常、モジュール性が望ましいでしょうが、そうでなければ必要とするような天才的な状況があるかもしれません。 – bsneeze

+0

唯一の本当の理由は、インストールと展開が簡単なことです。すべての "サービス"は機能の一部からかなり速いものなので、小さなコードにx個のWindowsサービスをインストールする必要はありません。 –

+0

@pyrochild - 私は、1つのアセンブリ内に複数のサービスをマウントする理由は数多くあると確信しています。私が今働いているところでは、顧客ごとにそのデザインの獣を使用しています。それは、それらのサービスとやりとりするソフトウェアを簡単にテストできるようにします。 – Hardryv

答えて

1

私はあなたが考えているものに非常によく似たものを実際に構築しています。私は(これまでのところ)サービス(サービスではありませんが、コントローラーは一つです)はすべてinit()とexecute()を使って特定のインターフェースを実装していますFREQUENCY列挙として)。

コントローラーはWindowsサービスで、実行時にxml設定ファイルからプログラム/ dllのリストを読み込み、リストにロードして、それらが定義した頻度でexecute()メソッド(該当する場合)を呼び出します。

私の場合、各プログラムには、ユーザーの制御/変更を可能にするコントローラーのタブページにロードされるユーザーコントロールも含まれています。興味があれば私はコードを投稿します。

明らかかどうかわかりません。私は実際に同様のものを実装した別のSOユーザーから実際にそのアイデアを得ましたが、今はその投稿を見つけることができません。

2

私は今日も同様の問題があり、それを解決することができました。

まず、各サービスに意味のある一意のServiceNameプロパティが設定されていることを確認しました。発電機は両方のサービスに助けにならなかった同じ名前を与えた。

次に、ProjectInstallerクラスを削除して再生成し、それぞれのクラスにインストーラーを追加しました。私は彼らが両方とも静的Mainメソッドでインスタンス化されていることを確認しました。

1つのDLLで2つのサービスをインストールできるようになりましたが、残念ながらサービスの1つを開始すると、それ自体と他のサービスの両方の機能を実行するようです。つまり、両方のサービスが実行されています(たとえ1つのサービスだけがコンピュータマネージャで「開始済み」と表示されても)。私はまだそれを理解しようとしています...

0

私は今日同じ問題を抱えており、それを修正することができました。 私の場合、私のサービスの* .designer.csファイルを開いて、サービス名が正しく設定されていることを確認してください。もっと重要なのは、* Installer.Designer.csに同じ名前を使用し、* Installer.csにコードがある場合です。

このエラーは名前の不一致のためにのみ発生すると思います。

希望これは、私はあなたたちはすでにこれを解決したことを推測

4

をhelpds、それ以外いくつかは、それを必要とする場合には、私は今日、私に数時間を要し、この問題への答えを投稿します。 解決策は、別のプロジェクトインストーラを追加するのではなく、プロジェクトインストーラのコンポーネントであるサービスインストーラです。新しく追加されたサービスインストーラには、2番目のサービス名が設定されている必要があります。

+0

これを行う方法を教えてください。 ://msdn.microsoft.com/en-us/library/zt39148a(v = vs.110).aspx遅延の場合: "デザイナウィンドウのコンテキストメニューを開きます(ポインティングデバイスを使用している場合は、ウィンドウ内をクリックして)、「インストーラーの追加」を選択します。 – wilsjd

+0

ポイント6と7の意味を理解できませんでした。 –

14

実行可能ファイルを1つではなく2つのサービスを持つ方法を理解しました。各サービスは、独自の名前と開始/停止機能を持つサービスマネージャーにインストールされます。私はこれがあなたが望むものだと思います、正しい?ここに私がしたことがあります:

  1. サービスプロジェクトを作成しました。
  2. 2番目のサービスを同じプロジェクトに追加しました(一意のサービス名を使用)。
  3. 両方のサービス(ServiceAとServiceB)にインストーラを追加しました。
  4. ProjectInstaller.Designer.vbファイルで、両方のサービスインストーラを表示するようにMe.Installers.AddRange行を変更しました。 (私の場合はServiceA)のメインエントリポイントで、ServiceToRun変数を、実行したいすべてのサービス(ServiceA(ServiceA)サービスB)。これは、サービスマネージャーがここでの引数の数に基づいてプロパティーを設定するため、重要なステップです。同じexeの複数のインスタンスまたは単一のインスタンスのみを許可するためです。
  5. インストーラプロジェクトを追加し、サービスの出力を使用します。
  6. サービスの出力を使用してカスタムアクションを追加します。

あなたはここでデモコードを見つけることができます:
http://code.google.com/p/multi-service-install/

をお楽しみください!

0

2つの異なるサービスと関連性のないサービスを1つの実行可能ファイルにインストールすると、面白い匂いが聞こえます。それを動作させることは可能ですが、正しいとは限りません。

さまざまな間隔でいくつかの異なるタスクを実行する必要があり、タスクが関連しているかどうかは関係ありません。 Quartz.NETを調べましたか?あなたのニーズに適しているように思えます。

http://quartznet.sourceforge.net/features.html

1

私は簡単にこれを達成するためのsc.exeを使用。 EXのためにhttp://support.microsoft.com/kb/251192

sc create "My Display Service Name" binpath= "c:\app\mysvc.exe --service"

注:「BINPATH」