C#で記述されたWindowsサービスがあります。私はそれをデバッグする方法についてすべてのグーグルスレッドを読みましたが、私はまだそれを動作させることができません。 「PathTo.NetFramework\InstallUtil.exe C:\ MyService.exe」を実行しました。インストールは成功しましたが、「Services.msc」を実行すると、サービスはどこにも表示されません。タスクマネージャーを開くと、「MyService.vshost.exe」というプロセスがあります。それはプロセスではなくサービスであるため、そうではありません。
Services.mscの実行時にサービスを表示することになっている場合(念頭に置いて、これはすべてサーバーなしのローカルマシンで行われますAT ALL。
VS2008を実行しています。
これはすべてローカルマシンで行われ、サーバーもアクセスもありません。また、私はサービスが何をするのかさえ知らないので、それをデバッグしたいので、コードをウォークスルーし、すべてがどのように機能するかを見ることができます(サービス自体ではなく、サービス内のコード-あなたのためにテンプレートを見ることをお勧めします)。
これらのどれも機能していません!何かを試すたびに、NET STARTを使用するか、サービスをインストールする必要があるというメッセージが表示されます。
VS2008を実行しています。
これを入力しました:C:\ WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe C:\ dev\Restarter\bin\Release\Restarter.exe
私はこれを得ました:Microsoft(R).NET Frameworkインストールユーティリティバージョン2.0.50727.3053 Copyright(c)Microsoft Corporation。全著作権所有。
トランザクションインストールの実行。
インストールのインストールフェーズの開始。 C:\ dev\Restarter\bin\Release\Restarter.exeアセンブリの進行状況については、ログファイルの内容を参照してください。ファイルはC:\ dev\Restarter\bin\Release\EDT.Restar ter.InstallLogにあります。アセンブリ「C:\ dev\Restarter\bin\Release\Restarter.exe」をインストールします。影響を受けるパラメーターは次のとおりです。logtoconsole = assemblypath = C:\ dev\Restarter\bin\Release\Restarter.exe logfile = C:\ dev\Restarter\bin\Release\Restarter.InstallLog
インストールフェーズが正常に完了し、コミットフェーズが開始されています。 C:\ dev\Restarter\bin\Release\Restarter.exeアセンブリの進行状況については、ログファイルの内容を参照してください。ファイルはC:\ dev\Restarter\bin\Release\Restar ter.InstallLogにあります。アセンブリ 'C:\ dev\Restarter\bin\Release\Restarter.exe'をコミットしています。影響を受けるパラメーターは次のとおりです。logtoconsole = assemblypath = C:\ dev\Restarter\bin\Release\Restarter.exe logfile = C:\ dev\Restarter\bin\Release\Restarter.InstallLog
コミットフェーズが正常に完了しました。
トランザクションインストールが完了しました。
C:\ Program Files\Microsoft Visual Studio 9.0\VC>
次にRUN-> Services.mscに行きましたが、何も表示されません。
「Restarter.vshost.exe」と呼ばれるプロセスがタスクマネージャーにあります。
それでおしまい。
私はそれをインストールしてデバッグしたかっただけです。私はそれが動作することを知っています(実行されてクラッシュしないので)。しかし、コードは友人によって書かれたものであり、デバッグモードでコードをウォークスルーすることで基礎となるコードを理解したいと思います。
デバッグには次のパターンをお勧めします。
var ServiceToRun = new SomeService();
if (Environment.UserInteractive)
{
// This used to run the service as a console (development phase only)
ServiceToRun.Start();
Console.WriteLine("Press Enter to terminate ...");
Console.ReadLine();
ServiceToRun.DoStop();
}
else
{
ServiceBase.Run(ServiceToRun);
}
編集:ターゲットがWindowsアプリケーションではなくコンソールアプリケーションであることを確認してください。そうでない場合は動作しません。
デバッガーをプロセスにアタッチすることでデバッグできます。これを行うには、プログラムのスタートアップに行を追加します。
Debugger.Launch ();
usingステートメントを追加した後:
using System.Diagnostics;
それを条件付きブロックに入れるか、デバッグが完了したら削除する必要があります
または、サービスを実行してから、IDEからプロセスに手動でアタッチすることにより:デバッグ->プロセスにアタッチします。
パラメーターを追加し、コンソールアプリのように動作させるだけで、Windowsサービスプロジェクトをデバッグ可能にできます。
1)Windowsサービスプロジェクトプロパティに移動->デバッグ->開始オプション2)引数を指定-コンソール3)アプリケーションタブに移動->出力タイプ、コンソールアプリケーションに変更4)Program.csに以下のコードを入力
static class Program
{
private static EventWaitHandle _waitHandle;
private static Service1 _service;
static void Main(string[] args)
{
bool runConsole = false;**
foreach (string arg in args)
{
if (arg.ToLowerInvariant().Equals("-console"))
{
runConsole = true;
}
}
_service = new Service1();
if (runConsole)
{
_waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
Console.WriteLine("Starting Workflow Service in Console Mode");
Console.WriteLine("Press Ctrl+C to exit Console Mode");
Console.CancelKeyPress += new ConsoleCancelEventHandler(OnCancelKeyPress);
_service.InternalStart();
WaitHandle.WaitAll(new WaitHandle[] { _waitHandle });
}
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1()
};
ServiceBase.Run(ServicesToRun);
}
static void OnCancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
_service.InternalStop();
_waitHandle.Set();
}
}
これは、Windowsサービスを開発/デバッグするときに非常に役立ちました。
http://windowsservicehelper.codeplex.com/
F5を押してデバッグします。非常に簡単。
アンドレイのアプローチも非常に優れています。
サービスをデプロイせずにデバッグできるようにするために、私は常に次のように記述します。
Program.csファイルで:
#if DEBUG
MyService myService = new MyService();
myService.OnDebug();
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#else
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MyService()
};
ServiceBase.Run(ServicesToRun);
#endif
myService.csファイルで:
public void OnDebug()
{
OnStart(null);
}
* NOTE *:デバッグが最終的に完了し、サービスを展開する準備ができたら、「リリース」モードでビルドする必要があります。そうしないと、サービスはサービスと見なされません。
お役に立てれば。
仮定:
1)VS2008 IDEのソリューションで利用可能なソースコードがある
C#サービスのデバッグ方法:
InstallUtil
を使用してサービスをインストールします。 (あなたはすでにそれをやったようです)bin
フォルダーで生成されるMyService.exeにサービスのOnStart()
メソッドの先頭に次のようなものを配置します。
_while(true)
{
System.Threading.Thread.Sleep(500);
}
_
System.Threading.Thread.Sleep(500)
にブレークポイントを置きます
ソリューションを構築する
Windows Service Utility を使用してサービスを開始します
サービスの開始中に、VS2008で_Debug -> Attach To Processes...
_に移動します
_Show Processes From All Users
_および_Show Processes In All Sessions
_がチェックされていることを確認してください
リストでMyService.exeを見つけ、Attach
をクリックします
これで、無限ループに挿入したブレークポイントにいるはずです。
コントロール(黄色の矢印)justを無限ループの外側にドラッグします
デバッグしてください!
免責事項:
ビルドをリリースする場合、または単にサービスを通常どおりに実行する場合は、忘れずに無限ループを削除してください。
サービス名が予期したものではない可能性があり、それが見つからない理由です。サービス名は、.NETプロジェクトのServiceInstaller
プロパティで定義されており、実行可能ファイル名と一致する必要はありません。ただし、インストール後にサービスがリストされていないことが確実な場合は、次のようにします。
まず、サービスのインストール。 2つのメソッドがあります、InstallUtil.exe
およびSC.exe
。最初のコードは、すべてのProjectInstaller
およびServiceInstaller
コードを実行するため、.NETサービス専用に調整されています。 2番目はそれを行いませんが、より多くのオプションを提供し、通常はより効果的です。つまり、InstallUtil
が失敗した場合に成功する可能性があります。これは、インストーラーコードに例外がある場合です。
すでにInstallUtil
でインストールしようとしているので、ここにSC
バージョンがあります:
sc create MyService binPath= "C:\Service.exe"
MyService
は、この時点でサービスに与える名前yoであり、任意の名前にすることができます(理由:-)。この名前は、サービスコンソールリストに表示されます。
サービスをインストールしたら、OnStart
が呼び出されたときにすぐにデバッグする必要があります。これは、サービス内から実行してデバッガー(Visual Studio)にアタッチすることで実現できます。
protected override void OnStart(string[] args)
{
#if DEBUG
Debugger.Launch();
#endif
...
}
このコードの変更後、サービス実行可能ファイルをビルドして置き換えることを忘れないでください。サービスを停止する必要がありますが、アンインストールして再インストールする必要はありません。
SC
を使用してサービスを削除するには:
sc delete MyService
プロジェクトプロパティの[デバッグ]タブに開始オプションとして/test
を追加することをお勧めします。その後、インストールせずにサービスを実行できます。
ビジネスレイヤーがWindowsサービスから分離されている場合は、Windowsサービスの実行以外ですべてのビジネス機能をテストできます。
Windowsサービスをテストするには、コンソールアプリであるテストプロジェクトを作成し、サービスを実行する新しいスレッドを開始します。
System.Threading.Thread sftpThread = new System.Threading.Thread((ThreadStart)service1);
service1.Start();
私は最近これをプロジェクトに追加しました。他のEXEと同じようにデバッグできます。追加した後、プロジェクトプロパティに移動し、デバッグビルド構成の[デバッグ]タブでコマンドラインパラメーター(/ EXE)を追加します。
<MTAThread()> _
Shared Sub Main()
''
'' let's add a command line parameter so we can run this as a regular exe or as a service
''
If Command().ToUpper() = "/EXE" Then
Dim app As MyService = New MyService()
app.OnStart(Nothing)
Application.Run()
Else
Dim ServicesToRun() As System.ServiceProcess.ServiceBase
' More than one NT Service may run within the same process. To add
' another service to this process, change the following line to
' create a second service object. For example,
'
' ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService}
'
ServicesToRun = New System.ServiceProcess.ServiceBase() {New MyService}
System.ServiceProcess.ServiceBase.Run(ServicesToRun)
End If
End Sub
TopShelfを使用してサービスを作成すると、Visual Studioから簡単にデバッグできるはずです。