是否有可能在我的应用程序中显示VS输出窗口内容
本文关键字:输出 VS 窗口 显示 有可能 我的 应用程序 是否 | 更新日期: 2023-09-27 17:50:19
长话短说:我在项目中使用的一些第三方非托管dll,显然在运行时将其错误转储到Visual Studio输出窗口(显示"Debug"的输出)。它看起来像这样:
*** WARNING ERROR 11 from R3ORP. The degree 0 polynomial fit is a perfect
*** fit within machine precision.
Here is a traceback of subprogram calls in reverse order:
Routine name Error type Error code
------------ ---------- ----------
R3ORP 6 11 (Called internally)
R4ORP 0 0 (Called internally)
R2ORP 0 0 (Called internally)
R2URV 0 0 (Called internally)
RCURV 0 0
USER 0 0
我想记录这些错误或在我的应用程序中显示它们。是否有可能以某种方式从我的应用程序访问VS输出流?我还能在没有VS的情况下做吗?我不需要整个流,但我想以某种方式捕获这些"警告"。我试过在Diagnostics.Debug
和Diagnostics.Trace
中添加监听器,但没有成功。
有!你可以实现你自己的TraceListener-Class。
首先写TraceListener-Class:
class CustomTraceListener : TraceListener
{
public string AllMessages { get; set; }
public override void Write(string message)
{
AllMessages += message;
}
public override void WriteLine(string o)
{
Write(o + ''n');
}
public override string ToString()
{
return AllMessages;
}
}
你可以在Write()
方法中实现自定义行为(如写入文本框等)。
然后你只需要把你的类的一个实例添加到系统的调试跟踪侦听器中,就可以了:
CustomTraceListener myTraceListener = new CustomTraceListener();
Debug.Listeners.Add(myTraceListener);
Debug.WriteLine("this is a test");
Debug.WriteLine("this is another test");
string result = myTraceListener.ToString();
如果这是一个非托管的dll,并且输出出现在Visual Studio输出窗口中,这意味着它正在使用OutputDebugString函数来写入数据。
由于此数据仅用于调试,因此不能保证后续版本仍将输出此信息,或坚持相同的格式。如果你不关心这个问题,在谷歌上快速搜索一下"c#捕获调试输出"就会得到这个答案。
这真是一个有趣的问题。
我找到了System.Diagnostics.TraceListener
类的解决方案。
sealed class StackOverflowSampleListener : TraceListener
{
// Singleton
public static readonly StackOverflowSampleListener Instance =
new StackOverflowSampleListener();
public void InitializeTracing(bool ReadDebugOutput)
{
if (ReadDebugOutput == true)
Debug.Listeners.Add(this);
else
Trace.Listeners.Add(this);
}
public StringBuilder Buffer = new StringBuilder();
public override void Write(string message)
{
// Do something with your messages!
Buffer.Append(message);
}
public override void WriteLine(string message)
{
// Do something with your messages!
Buffer.Append(message);
}
}
示例:
public Form1()
{
InitializeComponent();
StackOverflowSampleListener.Instance.InitializeTracing(true);
StackOverflowSampleListener.Instance.Buffer.ToString();
}
GuyMontag的回答是绝对正确的,但我更喜欢一个更轻的版本,带有单例实现,并且可能在发布模式下收集消息(看看initialize方法)。