0

デバッグ ビルドを開始しようとしてWindowsServiceいますが、タイムリーに開始されなかったというエラーが表示されます。

ctorをクリーンアップしましたOnStartが、それでも起動しないので、プロジェクトディレクトリのデバッグディレクトリだけでなく、ロードするdllをより適切にインストールする必要があると考えています。たぶん、ぶら下がっているのmain()は、それをぶら下げて乾かすことだけですか?

サービスをデバッグするための指針はありますか? VStudio で直接実行することはできません。明らかに、OnCustomCommand(int cmd)メンバーへのエントリが許可されず、そこで中断されるためです。

4

2 に答える 2

2

私の理解が正しければ、サービスがアイドル状態の「開始」状態になる前に、サービスをデバッグできるようにしたいですか?

これにはDebugger.Break()関数を使用できます。たとえば、デバッグ ビルド中に Main 関数に次のコードを挿入することがよくあります。

#if DEBUG

if (!Debugger.IsAttached)
{
    Debugger.Break();
}

#endif
于 2011-10-17T23:10:24.413 に答える
1

OnStart メソッドでは、できるだけ早く OnStart から戻ることができるように、すべての作業を実行するスレッドを開始するのに十分な init だけを行います。次に、スレッド デリゲートに Reddog のコードを追加して、デバッガーに割り込むことができます。おそらく、そこに thread.sleep を使用して、最初にプロセスにアタッチする時間を与えることができます。

もう 1 つの方法は、サービス クラスのインスタンスを作成して onstart/onstop を呼び出すことができる main メソッドをサービスに追加し、プロジェクトの出力をコンソール アプリに変更することです。その後、両方の長所を活用して、次のようにインストールします。 installutil を介してサービスを提供し、それを f5 で実行して、コンソール アプリとして Visual Studio でデバッグできます。

詳細はこちら

サービスをサービスとしてのみデバッグする場合は、OnStart メソッドが処理を実行するスレッドを開始してから戻ることをお勧めします。スレッド デリゲートは、Thread.Sleep(ある程度の時間)を実行してから戻ります。 Debugger.Break();

スレッド スリープにより、サービス コントロール マネージャーを使用してサービスを開始した後、デバッガーをプロセスにアタッチする機会が与えられます。次に、Debugger.Break() に到達し、デバッガーを強制的に中断して、シングル ステップを実行できるようにします。重要なことは、30 秒前に OnStart から戻り、ブレークポイントに到達する前にデバッガーをプロセスにアタッチすることです。

また、Debugger.Break はデバッガーをアタッチするオプションを提供すると思いますので、コードで試してみてください (UI がないと想定されているため、サービスでうまく動作するかどうかはわかりません)。デリゲートに追加し、30 秒前にプロセスにアタッチします。

于 2011-10-17T23:45:13.583 に答える