1

winform、コンソール、WPF など、ほとんどのプロジェクトで作業しているときに、必要に応じて、実行時にメッセージ ボックスなどを使用して、より簡単に確認したい情報を出力できます。

MessageBox.Show(whateveriwannashow);

ただし、私は現在、あらゆる種類の GUI の存在を許可しない Windows サービスに取り組んでいます。情報を表示するには、どの方向に進む必要がありますか? VS2010 には、この種の機能が組み込まれていますか?

4

4 に答える 4

3

System.Diagnostics.Traceは、あなたの新しい親友です。トレースは、Visual Studio の出力ウィンドウに直接出力され、ロガーに送信したり、SysInternals DebugView などの無料のサードパーティ ツールを使用して表示したりできます。

デバッグ作業では、ログ記録よりも優れています。理由は次のとおりです。

  1. ドライブに大きなログ ファイルが残ることはありません。これは、トレースを非常に細かくすることができ、ディスクに大きなファイルを残さないことを意味します。
  2. トレース出力をリッスンしているものがない場合、基本的にはイーサ内で失われます。
  3. DebugView (および外部依存関係のない Exe) を使用して、リアルタイムで出力を監視できます。
  4. ログに記録したい場合は、ロガーにトレース リスナーを追加するだけです。
  5. セットアップは簡単です
  6. デフォルトでは、出力ウィンドウに書き込みます。
于 2012-12-12T09:41:33.043 に答える
1

(半)永続的な情報については、Spencer に完全に同意します。しかし、デバッグやトレースのために簡単なランタイム情報が必要な場合は、コマンドライン ウィンドウを「ハイジャック」して書き込むことができます。

protected override OnStart(string[] args)
{
    int processId;
    IntPtr ptr = GetForegroundWindow();
    GetWindowThreadProcessId(ptr, out processId);
    var process = Process.GetProcessById(processId);

    if (String.CompareOrdinal(process.ProcessName, "cmd") == 0)
    {
        // Hijack an existing foreground cmd window.
        AttachConsole(process.Id);
    }
    else
    {
        // Or create a new one
        AllocConsole();
    }
}

protected override OnStop()
{
    FreeConsole();
}

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AllocConsole();

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool FreeConsole();

[DllImport("kernel32", SetLastError = true)]
static extern bool AttachConsole(int dwProcessId);

[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

次に、出力にコンソールを使用できます。理想的には、log4netなどのサードパーティのログ システムを使用できます。私のシナリオでは、セットアップは次のようになりました。

//Enable log4net logging into the console
ConsoleAppender appender = new ConsoleAppender {Layout = new SimpleLayout()};
BasicConfigurator.Configure(appender);

しかし、その部分はlog4net固有です。Console.Write()セットアップははるかに困難ですが、でも使用できるはずです。

これについて私が気に入っているのは、サービスのコマンドライン/構成パラメーターに「バインド」できることです。サードパーティのロガーは、ログをデフォルトの場所からコンソールに切り替えるだけです。コードでさらにチェックを行う必要はありません。また、これはどこでも実行できます-開発マシン、リモートサーバー...

とにかく、最初に言ったように、リアルタイムの情報が本当に必要ないのであれば、Spencer のアドバイスに従うと思います。

于 2012-12-12T09:51:30.590 に答える
1

ログを使用する必要があります。

テキストログが物理的に保存される方法を抽象化するサードパーティのライブラリを使用してログを記録するのはどうですか? app.config次に、任意の種類のログ出力を使用するようにサービスを構成できます。

  • データベース
  • ローリングフラットファイル
  • XML ファイル
  • Windows イベント ログ

コードを変更する必要はありません。

たとえば、 Enterprise Libraryまたはlog4netを使用できます。

于 2012-12-12T09:40:38.323 に答える