サービスプログラムのデバッグを考える〜VS2008 コンソールプログラムからのアプローチ

  • 2012.01.30 Monday
  • 21:01
ずいぶん前、サービスプログラムのデバッグについて書いたことがあるが、
読んでもらえれば分かるとおり、サービスのデバッグはやたら面倒である。

もっと簡単にできる方法はないのか?と考えてみた。


サービスは簡単に言えば、
バックグラウンドで動く定常的な処理を行うプログラム
ということらしい。
(駐在型プログラムともいうらしい)

定常的といえば、昔、C言語とかで簡単なソースを書いて、
Dos窓で定期的に処理するプログラム(コンソールプログラム)を作ったことを思い出す。

サービスとの違いといえば、DOS窓が開きっぱなしなこと、
自動起動しないので、スタートアップかタスクに入れておかないといけないこと、
うっかり×を押してしまったら処理が停止してしまうくらいなものだろうか。


もし、サービスとコンソールにそれほど大きな違いがなければ、
コンソールで一度デバッグ用のソースを書き、
おおよそプログラムが完成してきたら、サービスへ移行していく
というほうがより開発が簡単にいくかもしれない。

というのがこの記事のお題

サービスとコンソール


では、サービスとコンソールでは何がどう違うのか?
というのをざっくりと見てみると次の点に違いがあることが分かる。


1.アプリケーションの種類

当たり前だが、アプリケーションの種類はコンソールかサービスのどちらかが指定されている。
スタートアップオブジェクトはコンソールはメインのモジュール、
サービスはメインのクラスが選択されている。

サービスとコンソール

2.参照の違い
サービスの方はServiseProcessというクラスが参照されているくらいで、
その他は全く同じである。

サービスとコンソール


3.モジュールかクラスか
上でも書いたが、コンソールはモジュールサービスはクラスになるが、
内容を見ると、Sub Mainで起動するか、OnStartで起動するかというくらいの違いで
あまり変わりないように見える

サービスとコンソール


上の3点の違いで、サービスかコンソールかのどちらかに化けるようである。

ならば、話は簡単、まず、サービスプログラムを作成し、
そのソースやプロパティの内容をいじくりまくって、
なんとなくコンソールっぽいプログラムを作るという手順で行けるかもしれない。



では早速。

の前に、以下に書く手順はサービスプロジェクト→コンソールにする方法である。

コンソールプロジェクト→サービスでもできないことはないが、
初心者には途方もなく面倒くさい手続き(※)となるので、
サービス→コンソールの順でやっていく方がよい(と感じた)。


※面倒くさい理由として、Serviceには隠しファイルで、デザイナファイル(XXX.Designer.vb)が存在するからだ。
これは、サービスが上でも書いた、System.ServiceProcessのServiceBaseを継承して作られているためで、
特にユーザーがいじる必要のない部分で隠されているためである。

もし、コンソール→サービスで作った場合は、この継承部分をソースのどこかに書いておけばよい。




●ソースを編集する
まずクラスの中身を下図の上のようにコメントアウトしてしまう。
こうすればモジュールに化ける。

モジュールにするとOnStopでエラーが出るので、
丸ごとコメントアウトしておく

この状態でプログラムをコンソールとして構築していく。

そして、コンソールである程度デバッグも終わり運用に近い状態になってきたら、

下図の下のようにモジュールをコメントアウトして、元のクラスに書き換えれば、
一瞬でサービスへ戻る。


サービスの場合は、OnStopを復活させて終了処理を追加し、

最終的なデバッグを行えば良い。
デバッグ方法は以前説明したとおりである。


サービスとコンソール


●プロパティの編集する
続いて、アプリケーションのプロパティを編集する。
アプリケーションの種類をコンソールに切り替え、
スタートアップオブジェクトを起動モジュールに変更すれば終わりである。
サービスに戻すなら、その逆をすれば良い。


サービスとコンソール


ちなみに、Sub Mainを選択すると
 
'Sub Main' が 'WindowsService1' で 2 回以上宣言されています:WindowsService1.Module1.Main(args() As String), WindowsService1.Service1.Main()

という警告メッセージが出る。

これは、サービスクラスのService1.Designer.vbにShared Sub Main()が既にあるからである。

なので、ここはModule1を選択しておく方がよい。
(自動的にSub Mainを探して起動してくれる)

もし、こういったプロパティの変更が面倒であれば、
はじめからテスト用のコンソールアプリを作ってデバッグして、
最終的にサービスプログラムへソースをコピペでちょちょっと編集というのでも良いと思う。
その方が、プロパティをいちいちいじったりせずに編集ができるし、楽だと思う(上のコメントアウトの変更は必要だが)。


こんな感じでコンソールからサービス開発をアプローチするのはいかがでしょうか
 
追記1

ふとこれも使えるのでは?
と試してみたところ、使えたので、追記

いわゆるコンパイル定数のカスタム定義というもの。

これならいちいちコメントアウトしなくてもコンパイル定数の値を変えるだけで、
一発で切り替えができて便利である。

サービスとコンソール

これでも面倒、オプションを元に戻したか、Releaseだったか、サービスプログラムに切り替えたか忘れてしまう

という方へ後に書いたクラスやモジュールを共有したい選択したプロジェクトをデバッグしたいという投稿を応用する手がある。

詳しいことは読んでもらって、手順をちょっと端折るが書いてみると

まずサービスを作って、そのソースをコピーする
コピーするのは、VBならvbprojが入っているフォルダ

サービス デバッグ

コピーしたら、ソリューションを開いて既存のプロジェクト名を変更する。
(プロジェクト名を変更しないと既存の追加ができない)

アセンブリ名は変更しなくても良い(区別するために変更するというのでもよい)
アプリケーションの種類とスタートアップオブジェクトをコンソールに変更する(上記参照)。

サービス デバッグ

コンパイル定数に ConsoleMode=True を追加する。これで、いちいちソース内で切り替える必要はない
したがって、ソース内の #Const ConsoleMode = True は不要なので、コメントアウトしておく。
 
追記
#Const ConsoleMode のところは、基本的にデバッグモードでしか使わないので、
DEBUG = Trueで囲んであげればコメントアウトの手間が省ける
 
#If DEBUG = True Then
''' <summary>コンソールモード(True:コンソール)</summary>
#Const ConsoleMode = True
#End If


サービス デバッグ


さて、サービス本体をソリューションに追加していく。
メニューから既存のプロジェクトを追加する。

サービス デバッグ

先ほどコピーしたフォルダ内のプロジェクトを選択で開く

サービス デバッグ

追加したら、コピー先の不要な物を削除する
ここでは Service1.vb を削除(他にも重複する物はすべて削除)

サービス デバッグ

続いて、追加から既存の項目を選択して、

サービス デバッグ

コンソール化したプロジェクトの Service1.vb をリンクとして追加する(ここがミソ)
他にも重複していたソースをリンクとして追加する。

サービス デバッグ

リンクとして追加されているか確認

サービス デバッグ


選択した項目が編集(デバッグなど)対象となるように、
ソリューションのプロパティから「現在の選択」を選んでおく。

サービス デバッグ

片方がコンソールのプロジェクト(コンパイルオプション付き)で、
もう片方がリリース用のサービスプロジェクトとなる。

あとは、コンソールでデバッグをかけて、問題なければ、
サービスでビルドしてリリースである。

サービス デバッグ


いろいろ応用して、サービス開発を楽にしてみてください。

ただ、こんなメッセージが切り替えるたびに出るので、面倒なことも

リンクで追加
 
追記2

まれに、ファイルが正しく読み込まれず、
スタートアップオブジェクトがSub Mainを見つけられないといったエラーが出る場合がある。

サービス デバッグ sub main
Sub Mainが、xxxに見つかりませんでした。


エラーをダブルクリックすると、
対象のモジュールを選択するようにメッセージが開く

サービス デバッグ sub main

対象のオブジェクトを選択してOKすればよい
 



関連投稿
サービスプログラムのデバッグ

クラスやモジュールを共有したい〜VB2008
選択したプロジェクトをデバッグしたい〜VS2008

 
コメント
コメントする








    
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
      1
2345678
9101112131415
16171819202122
23242526272829
30      
<< April 2017 >>

search this site.

よく使う、検索される投稿

categories

アマゾン

楽天

selected entries

archives

recent comment

recent trackback

profile


※当ブログはリンクフリーですが、 取材や雑誌等で掲載される場合は、事前にお知らせください

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM