2

Windows Formsデバッグモード(F5)でプロジェクトをビルドVS2010すると、[出力ウィンドウ]というタイトルのウィンドウが表示されます。出力ウィンドウの上部には、「Find Message in Code」、「Next Message」 、「」のボタンがありますPrevious Message。ただし、それらは常にグレー表示(無効)になっています。これらはどのようにして有効になりますか?

これらのボタンの目的は、出力ウィンドウにメッセージが表示される原因となったコード行を見つけるのに役立つことを期待しています。たとえばTrace.WriteLine("MyMessage");、クライアントコードを記述した場合、実行すると' 'が;MyMessageに表示されます。Output Window出力ウィンドウでメッセージを選択して「Find message in Code」をクリックすると、「」を含むクライアントコードの行に移動すると思いましたMyMessage。これが有効になっていて、私の推測が正しければ、これは洗練された機能になります。残念ながら、有効にするボタンを取得できません。

この質問に答えるには、これらのボタンを有効にして使用する方法と、ベストプラクティスを適用する必要があるかどうかを説明してください(オプション)。

参照として使用するいくつかのソースコードを次に示します。プロジェクトを作成し、Windows Forms以下に表示されている変更を加えると、私が試みていることを再現できます。

// program.cs

using System;
using System.Diagnostics;
using System.Windows.Forms;

namespace MyNamespace
{
    internal static class Program
    {
        [STAThread]
        private static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            try
            {
                throw new ApplicationException("MyMessage"); 
                Application.Run(new FormMain());
            }
            catch (ApplicationException e)
            {
                Trace.WriteLine(e.ToString());
            }
        }
    }
}

JasonDの推奨

交換しました

Trace.WriteLine(e.ToString());

Trace.WriteLine("Program.cs" + "(" + 23 + ")" + " Some info");

JasonDソリューションの終了-結果:ボタンが有効になりました

それはそれを解決しました。そして、なんと予想外の答えでしょう。強く型付けされたすべての時代では、答えは文字列を魔法のメッセージでフォーマットすることに依存します。私はこれに驚いています。

4

1 に答える 1

3

解析できるものを出力する必要があります。これは、コンパイル時に表示されるエラー/警告メッセージと基本的に同じ形式で、で構成されてい"FILENAME(LINE) stuff"ます。

C#では、次のようになります。

        string file_= new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName();
        int line_= new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileLineNumber(); 
        System.Diagnostics.Trace.WriteLine(file_+ "(" + line_.ToString() + ") Some info");

(これは少し厄介ですが、私が見つけたC / C ++__FILE__やマクロに相当するものはありません)__LINE__

それを少し整理して関数でラップすることはできますが、実際の関数自体ではなく、呼び出し元のファイル/行を取得する必要があります。

    static void traceFunc(string msg)
    {
        System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(true);
        string file = trace.GetFrame(1).GetFileName();
        int line = trace.GetFrame(1).GetFileLineNumber();
        System.Diagnostics.Trace.WriteLine(file + "(" + line.ToString() + ") " + msg);
    }
于 2012-12-22T18:59:03.620 に答える