当我在调试模式(F5)中在Windows Forms
中构建VS2010
项目时,会出现一个名为Output Window的窗口。输出窗口顶部有按钮:“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解决方案 - 结果:启用按钮
解决了它。这是一个意想不到的答案。在这个强类型的时代,答案取决于使用魔术消息格式化字符串。我很惊讶。
答案 0 :(得分: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);
}