2011-02-09 7 views
7

Visual Studioのデザイナーから "ヘルプ"なしでWindowsサービスアプリケーションを作成して管理したいと思います。この以来Visual Studioの干渉を受けないWindowsサービス

は、.NETで、MSDNで判断し、設計者が何をするか、これはInstallerから継承し、構築しServiceProcessInstallerを扱うとServiceInstallerがserivceのインストール時に実行を管理することができることを意味します。

ランタイム、これはServiceBaseサブクラスを作成し、ServiceBase.Runを用いMainからそれを起動(および方法を扱う様々なServiceBaseイベントをオーバーライドする)を意味します。

しかし、これを行うと、Visual StudioはInstallerServiceBaseというサブクラスを設計者が編集したファイルとして扱うことを主張しています。これは、手書きのコードを扱うことができないという事実はもちろんのこと、読みやすさには必ずしも役立たない。 私はデザイナーを避けたいと思っています。なぜなら、すべての後にをインストールする必要のあるWindowsサービスなど、テストやデバッグには難しいコードの場合には、また、コンパイル時ではなく、実行時にサービス名を指定できるようにするために、デザイナーはそれをサポートしていません。

どのようにして、すべてのgunkがなくてもWindowsサービスアプリケーションを作成できますか?

+2

を - http://topshelf-project.com/ – stuartd

+0

うーん - きちんと!少し残酷に見えますが、まだ成熟していませんが、もし私が新しいアプリを書いているのであれば、間違いなくそれを検討するでしょう。 –

答えて

-1

VSは余分なものを追加しますが、私は本当にそれについて心配しません。 VS2005で簡単なサービスを手動で作成するためのチュートリアルです。新しいバージョンでもうまく動作します。

http://www.codeproject.com/KB/system/WindowsService.aspx

+1

'ServiceName'が定数でないときにデザイナーがクラッシュし、私が書いたコードが変わってしまいます。デザイナーは本当に欲しくないのです。また、生成するコードは、必要なコードよりも5倍も大きく、理解しにくいものです。 –

+1

私はそれをこのように置いておきます:必要なタイプを含む初期のテンプレートとして役立つ以外に、デザイナーのための*有用な機能がありますか? –

2

まあ、単にコンストラクタ内のInitializeComponent()の呼び出しを削除し、設計者がコードを生成し、あなたの髪の外にあります。

+0

それは動作しません:ビジュアルスタジオは "スマート"です:あなたがクラスとして、またはコンポーネントとしてファイルを追加したかどうか気にしません - 重要なのは継承階層です。 'Installer'と' IComponent'から継承すると、元々 "Add Class"でファイルを作成していたとしても、デザイナーが手に入ります。 –

+0

私は 'Installer 'の前にナンセンスクラスを追加しようとしました。それはまだデザイナーを使用しています。回避策は、右クリックをすることです:Open-with CSharp Editorを選択し、デフォルトとして設定します。別のマシン上の新しいソース管理チェックアウトがそのユーザー設定を失い、コード作成の面倒なデザイナーに戻ってしまうので、不満足です。 –

+1

私はrepro。いや、そうじゃない。 –

5

私は、多くの場合、サービスはこのようにそれを行う作成するので:その後、私はこの

internal class MyService : ServiceRunner 
{ 
    public MyService() { 
     ServiceName = ConfigurationManager.AppSettings["MyServiceName"]; 
    } 

    private static void Main(string[] args) { 
     Startup(args, new MyService(), true); 
    } 

    protected override void OnStart(string[] args) { 
     base.OnStart(args); 
     ... 
    } 

    protected override void OnStop() { 
     ... 
     base.OnStop(); 
    } 
} 
のように私のすべてのサービスを作成

internal class ServiceRunner : ServiceBase { 
    protected static void Startup(string[] args, ServiceRunner instance, bool interactiveWait) {  
    if (instance == null) 
     throw new ArgumentNullException("instance"); 

    if (Environment.UserInteractive) { 
     instance.OnStart(args); 
     if (interactiveWait) { 
      Console.WriteLine("Press any key to stop service"); 
      Console.ReadKey(); 
     } 
     instance.OnStop(); 
    } 
    else 
     Run(instance); 
} 

私はこのようになり、共通の基本クラスを持っています

これで、デバッガまたはコマンドラインでサービスを実行するだけで、サービスをテストできます。

インストールする場合、私は(私はダブルクリックで開くのデザイナーを止めることができていない)

8

ServiceBase

sc create ServiceName binPath= C:\...\MyService.exe 

コマンドラインを使用するにはComponentから派生しています。あなたはそのような属性を付けることができますデザイナービューを無効にするには:あなたはTopShelfプロジェクトを見てしたい場合があります

[System.ComponentModel.DesignerCategory("Code")] 
public class MyService : ServiceBase 
{ 

} 
+0

これは動作しますが、継承を追加する前にこの行を追加した場合、デザイナーは作成されません。 – Matthew

+0

これは確かに正しい答えです、チャンピオンのように動作します! – Ronald

+1

作業中ですが、これが有効になる前に、 'System.ServiceProcess'への参照を削除して再追加する必要がありました。 –

関連する問題