2

当我在调试模式 (F5) 下构建Windows Forms项目时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 回答