我正在尝试将消息写入输出窗口以进行调试。我搜索了一个类似 Java 的 system.out.println("")
的函数。我尝试了 Debug.Write
、Console.Write
和 Trace.Write
。它不会给出错误,但也不会打印任何内容。
“定义调试常量”和“定义跟踪常量”选项被选中。
菜单工具→选项→调试→“将所有输出窗口文本重定向到立即窗口”选项未选中。
配置:活动(调试)
注意:如果相关,我使用向导创建了一个项目作为“Windows 窗体应用程序”。我不知道在哪里看。
Debug.Write
,并且在发布模式下构建库(这通常是 nuget 包的情况),那么即使您在调试模式下运行测试/应用程序,它也不会记录。我建议将 Trace.Write
作为替代方案
添加 System.Diagnostics
命名空间,然后您可以使用 Debug.WriteLine()
快速将消息打印到 IDE 的输出窗口。有关详细信息,请参阅以下内容:
如何在 Visual C# 中进行跟踪和调试
使用 Debug 和 Trace 类的论文,包括异常处理
这将写入调试输出窗口:
using System.Diagnostics;
Debug.WriteLine("Send to debug output.");
Debug.WriteLine
就是你要找的。
如果没有,请尝试这样做:
菜单工具→选项→调试→取消选中立即发送输出。
Tools|Options|Debugging uncheck Send Output to Immediate
对我来说,只有 Trace 命名空间而不是 Debug 命名空间有效:
System.Diagnostics.Trace.WriteLine("message");
我在 Visual Studio 2010 下的 C# 项目中工作。
您可能正在寻找
MessageBox.Show()
或者
Debug.Writeline()
MessageBox.Show()
可能会非常烦人。
MessageBox.Show
不会写入它。
通话
System.Diagnostics.Debug.WriteLine("message");
使用 .NET Core(V 1.0 或 1.1)时失败。
我们应该创建和使用来自 Microsoft.Extensions.Logging
的记录器,但该日志只出现在 dotnet.exe 弹出控制台窗口中,而不出现在 Visual Studio 的输出窗口中。
出于调试目的,除非您有调试侦听器,否则不会将 System.Diagnostics.Debug.WriteLine()
命令编译到您的代码的发布版本中。在调试模式下运行时,它会写入所有包含 VS 输出窗口的跟踪侦听器。
对于控制台应用程序。 Console.WriteLine()
可以工作,但输出仍会在您的二进制文件的发布版本中生成。
调试测试时,调试输出也应该出现在正常输出窗口中;然而,console.writeline 输出没有(但可以在测试输出窗口中找到。)
这需要第三方框架,即 Serilog,但我仍然发现它是一种非常流畅的体验,可以将输出发送到我可以看到的某个地方。
您首先需要安装 Serilog 的 Trace sink。安装后,您需要像这样设置记录器:
Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.Trace()
.CreateLogger();
(您可以设置不同的最低级别或将其设置为配置值或任何正常的 Serilog 功能。您还可以将 Trace
记录器设置为特定级别以覆盖配置,或者您想要这样做。)
然后您只需正常记录消息,它们就会显示在您的输出窗口中:
Logger.Information("Did stuff!");
这似乎没什么大不了的,所以让我解释一些额外的优势。对我来说最大的一个是我可以同时登录到输出窗口和控制台:
Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.Trace()
.WriteTo.Console(standardErrorFromLevel: LogEventLevel.Error)
.CreateLogger();
这在我如何使用输出方面给了我很大的灵活性,而无需使用 Debug.Write
复制对 Console.Write
的所有调用。编写代码时,我可以在 Visual Studio 中运行我的命令行工具,而不必担心退出时会丢失我的输出。当我部署它并需要调试某些东西(并且没有可用的 Visual Studio)时,控制台输出可供我使用。当它作为计划任务运行时,也可以将相同的消息记录到文件(或任何其他类型的接收器)中。
最重要的是,使用 Serilog 执行此操作使得将消息转储到多个目的地变得非常容易,确保无论我如何运行它,我都可以随时轻松地访问输出。
它还需要非常少的设置和代码。
这不是对原始问题的回答。但是由于我在搜索交互式转储对象数据的方法时发现了这个问题,我认为其他人可能会从提到这个非常有用的替代方案中受益。
我最终使用了命令行窗口,输入了Debug.Print
命令,如下图。这以可以复制为文本的格式打印了一个内存对象,这是我真正需要的。
> Debug.Print <item>
id: 1
idt: null
igad: 99
igbd: 99
gl_desc: "New #20"
te_num: "1-001-001-020"
System.Diagnostics.Debug.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(response));
Debug.Print("text here")
或者
Console.WriteLine("text here")
对于使用 NCrunch 的任何人,调试输出将重定向到 NCrunch 的“跟踪输出”窗口。
以下在 Visual Studio 2015 中对我有用:
OutputDebugStringW(L"Write this to Output window in VS14.");
阅读 OutputDebugStringW here 的文档。
https://i.stack.imgur.com/nwcPr.png
/*using System.Runtime.InteropServices;*/ [DllImport("Kernel32.dll", CharSet = CharSet.Unicode)] static extern void OutputDebugStringW(string lpOutputString);
导入它,遗憾的是,它没有按预期工作(它没有像 System.Diagnostics.Debug.WriteLine()
那样在 C# 项目的调试输出窗口中打印)。