写入 Visual Studio 输出窗口,万无一失

Posted

技术标签:

【中文标题】写入 Visual Studio 输出窗口,万无一失【英文标题】:Writing to Visual Studio output window, the sure-fire way 【发布时间】:2018-06-19 22:46:21 【问题描述】:

与“Writing to output window of Visual Studio?”中的要求完全相同,但是解决了剩下的问题 --

我假设如果我在没有调试 (ctrl-f5) 的情况下启动,就无法写入输出,对吗? – previous_developer 2012 年 2 月 27 日

Debug.WriteLine() 仅在 Debug 中运行时有效。这意味着使用 F5 而不是 CTRL-F5 运行它。 – kirk.burleson 2013 年 7 月 15 日

但事实并非如此,因为:

刚刚在这里运行了一个小应用程序,对我来说很好用。也许您的环境中有一个小故障? – Bhargav Bhat 2012 年 2 月 27 日

此外,

在正常运行期间,我可以在 Visual Studio 输出窗口中看到一些信息打印

[1/10/2018 11:56:25 AM Informational] ------ Run test started ------
[1/10/2018 11:56:26 AM Informational] NUnit Adapter 3.9.0.0: Test execution started
[1/10/2018 11:56:26 AM Informational] Running selected tests in  ...\Demo.dll
[1/10/2018 11:56:26 AM Informational] NUnit3TestExecutor converted 14 of 14 NUnit test cases
[1/10/2018 11:56:45 AM Informational] NUnit Adapter 3.9.0.0: Test execution complete
[1/10/2018 11:56:45 AM Informational] ========== Run test finished: 1 run (0:00:19.3066647) ==========

为了在调试模式下运行,NUnit 调试输出将如下所示:

[1/10/2018 2:56:55 PM Informational] ------ Run test started ------
[1/10/2018 2:56:56 PM Informational] NUnit Adapter 3.9.0.0: Test execution started
[1/10/2018 2:56:56 PM Informational] Debugging selected tests in ...\Demo.dll
[1/10/2018 2:56:57 PM Informational] NUnit3TestExecutor converted 14 of 14 NUnit test cases
[1/10/2018 3:03:38 PM Informational] NUnit Adapter 3.9.0.0: Test execution complete
[1/10/2018 3:03:38 PM Informational] ========== Run test finished: 1 run (0:06:43.6161412) ==========

也就是说,无论是正常运行还是调试模式,NUnit Adapter 都能写入 Visual Studio 输出窗口,区别仅在于文本“Running selected tests”或“调试选定的测试"

所以,这里是调试输出情况的总结正常运行期间不在调试模式

对于 C# 控制台,Debug.WriteLineTrace.WriteLine 都可以正常工作。我已经创建并验证了这个:https://pastebin.com/Du6ZbDV3 但是对于没有控制台的类/表单等,Debug.WriteLineTrace.WriteLine 都不起作用。示例:https://pastebin.com/b7P0bYEa。 “这很简单,但仍然一无所获——以前的开发者 2012 年 2 月 27 日”。 在作为 C# 类库的 NUnit 测试中,Debug.WriteLineTrace.WriteLine 都不起作用。我已经运行了几次并且可以确认这一点。我不会在这里发布我的测试代码,因为它很长并且需要很多库才能工作,而且它是由与https://pastebin.com/b7P0bYEa 相同的故障引起的。

总而言之,如何从类 lib 或 win 表单写入 Visual Studio 输出窗口?

【问题讨论】:

我建议单元测试是一个单独的问题,取决于您使用的测试运行器。一些测试运行者可能会将信息写回 Visual Studio,而有些则可能不会。使用 Trace 的 WPF/Winforms 应用程序会在调试模式下写入 VS 输出控制台,只是对其进行了测试。 (使用 VS 2017)。在没有调试的情况下运行与 Visual Studio 没有实际连接,所以如果输出窗口有办法显示应用程序中的某些内容,我会感到惊讶。 哦,在那种情况下,我对单元测试更感兴趣——在我的 NUnit 测试中,我自己做了一些Debug.WriteLine,并且需要在 VS 输出窗口中,甚至只是运行时,而不是调试(调试时输出很好)。好的。那我会提供一个小样本。 哦,只是重新阅读您的评论@AlexPaven - 你的意思是 Trace 写入 VS 输出控制台“处于调试模式”,但这不是我的意思问。我知道在调试模式下运行很好。我问的是 正常运行,CTRL-F5 -- "Debug.WriteLine() 仅在 Debug 中运行时才有效。这意味着使用 F5 而不是 CTRL- F5." 试试我的小型 C# 控制台应用程序,然后你就会知道了。 您要求做一些 IDE 不适合做的事情。也许开始一个新的问题来解释你想要完成什么,而不是你想如何完成它,会更有用。 在正常运行期间写入 Visual Studio 输出窗口是我想要完成的。请注意,“无论正常运行还是调试模式,NUnit Adapter 都能写入 Visual Studio 输出窗口”。 【参考方案1】:

要同时使用Debug.WriteLineTrace.WriteLine,我们需要添加using System.Diagnostics,这仅在调试时有效(F5)。即使是 C# 控制台项目,我们仍然无法在 Start without Debugging (Ctrl + F5) 时获得 Debug.WriteLineTrace.WriteLine 输出,要查看输出,我们必须在 Debugging ( F5)

对于类库项目,它只能构建或编译,我认为我们不能启动或运行它,因为它不是控制台项目,除非它在控制台项目中被调用。

更新:

为了调试类库项目并显示其输出,我在 VS 的解决方案中添加了一个单元测试。 我的类库代码:

    namespace ClassLibrary1

   public class hello
    
        public static void foo()
        
            Console.WriteLine("Hi, this is a console writeline");
            Debug.WriteLine("Hi, this is a Debug writeline");
        
    

在单元测试项目中,我将 ClassLibrary1 添加到参考中

而我的 unite test 项目代码很简单:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using ClassLibrary1;


namespace UnitTestProject3

    [TestClass]
    public class UnitTest1
    
        [TestMethod]
        public void TestMethod1()
        
            hello.foo();

        
    

然后在运行测试方法后,我可以得到输出:

【讨论】:

感谢@Fletch,我更新了我的 OP,“无论正常运行还是在调试模式下,NUnit Adapter 都能够写入 Visual Studio 输出窗口”,请您评论一下这是怎么可能的? @xpt 好吧,因为它是一个测试项目,无论是单元测试还是编码的UI测试项目,当我们运行测试时,输出都是来自测试,因为项目有测试适配器(MSTest.Adapter或NUnit适配器在你身边)。当然,我们也可以 Debug Tests,看看 Debug 的输出。 Visual Studio 允许我们调试测试。 感谢@Fletch 的解释。对于类库项目,因为可能没有与之关联的控制台,但是如果我在类库代码中执行Debug.WriteLine within,这些写入会写入到哪里?无论正常运行还是调试模式,我如何确保它始终有效? @xpt 我们需要在引用库项目的解决方案中添加一个可执行项目,并将可执行项目设置为启动项目。我们还可以添加一个单元测试,我会以它为例并在我的答案中更新它。 A~~h~~,那里!谢谢弗莱奇。我自己从来没有在那里找到它。 :)

以上是关于写入 Visual Studio 输出窗口,万无一失的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 2010 中将输出消息写入“输出窗口”的最简单方法?

Debug.WriteLine 未将输出写入 Visual Studio 2010 中的 OutputWindows

Visual Studio 2010中的多个输出窗口

Visual Studio 输出窗口中不显示输出跟踪

如何从 Visual Studio 调试输出窗口中读取文本

EF Core如何输出日志到Visual Studio的输出窗口