如何在Windows 10上的UWP中输出到控制台?

56

是否有一种方法可以像使用 Console.WriteLine() 一样在 UWP 应用程序中写入到控制台 /命令提示符/ Powershell 或类似的任何东西?

如果控制台不可用,是否有适当的替代方案可以用来写入大量文本到屏幕上?

当然,我可以创建一个 XAML 控件并将其输出到其中,但与简单的 Console.WriteLine() 相比,这似乎不太方便。

也有非常古老的讨论关于 WPF 控制台,但是从那里似乎没有任何有效方法(至少,我找不到 项目属性-应用程序选项卡-输出类型-控制台应用程序,并且 Trace.WriteLine("text") 不可用)。


1
你可以使用Debug.WriteLine()将内容写入输出窗口。 - Christo S. Christov
4个回答

85

你可以使用来自 System.Diagnostics 命名空间的 Debug.WriteLine 方法。

MSDN 链接

当你开始调试应用程序时,这些消息将显示在输出窗口中(Visual Studio 的标准快捷键是 Ctrl+Alt+O,ReSharper 的快捷键是 Ctrl+W,O)。


这似乎是部分解决方案,但是否有办法像控制台那样输出到单独的窗口?顺便问一下,在Visual Studio 2015中,输出窗口不是Ctrl+Alt+O吗? - Bad
2
啊,抱歉!是的,标准快捷键是Ctrl+Alt+O,Ctrl+W,O是ReSharper的快捷键。 至于像控制台这样的单独窗口-UWP适用于Windows Mobile 10和Windows 10。我认为不可能运行类似于带有控制台的单独窗口。老实说-我不明白这样做的意义所在。如果是为了调试目的,那么输出窗口是理想的地方。另一种解决方案是创建XAML控件以显示文本(正如您在问题中提到的)。 - Grzegorz Piotrowski
1
另一个选项是打开一个新窗口,显示您的日志记录。这里有一个例子 您应该创建一个新的XAML页面(在其中可以声明一些控件来显示其他信息),并在新窗口中打开它。但是,您必须实现一些自定义逻辑来在窗口之间传输信息并显示它。 但是,如果这只是用于调试,则最好的选择是使用输出窗口。 - Grzegorz Piotrowski
有没有可能的原因是为什么它在Visual Studio 2015更新2中不起作用?我在输出窗口中没有看到任何消息。 - Fei Zheng
@serup - 试试这个:https://dev59.com/unM_5IYBdhLWcg3wjjwp - Grzegorz Piotrowski
显示剩余4条评论

3

从RS4开始(即2018年中期发布的版本),您可以使用UWP构建命令行应用程序或将信息输出到命令行。预发行版SDK已经可用,您可以观看Channel 9视频


1

您可以使用LoggingChannel类来创建ETW跟踪事件。

LoggingChannel的好处是您可以进行复杂的跟踪(并使用高级工具,如PerfView等),但也可以通过LoggingChannel.LogMessage方法的简单等效性来实现Debug.WriteLine的简单性。

public void LogMessage(String eventString)

或者

public void LogMessage(String eventString, LoggingLevel level)

这比Debug.WriteLine有许多优点:

  • 速度更快,您可以轻松记录数百万条消息,而Debug.WriteLine则非常缓慢(基于古老的Windows OutputDebugString函数)。
  • 它不会阻塞发送者或接收者。
  • 每个通道都由其自己的GUID标识,而使用Debug.WriteLine时,您会从任何地方和任何人那里获得所有跟踪信息,有点混乱,难以找到自己的跟踪信息。
  • 您可以使用跟踪级别(Critical、Error、Information、Verbose、Warning)
  • 您可以使用PerfView(如果您真的想要)或Device Portal或任何其他ETW工具

因此,要发送一些跟踪信息,只需添加以下内容:

// somewhere in your initialization code, like in `App` constructor
private readonly static LoggingChannel _channel = new LoggingChannel("MyApp",
        new LoggingChannelOptions(),
        new Guid("01234567-01234-01234-01234-012345678901")); // change this guid, it's yours!

....
// everywhere in your code. add simple string traces like this
_channel.LogMessage("hello from UWP!");
....

现在,如果你想要一种简单的方法在本地机器上显示这些跟踪信息,除了使用PerfView或其他ETW工具之外,你可以使用我编写的一个名为WpfTraceSpy的免费开源GUI工具,可以在这里找到:https://github.com/smourier/TraceSpy#wpftracespy 或者这里有一个示例.NET Framework控制台应用程序,它将输出所有跟踪信息及其级别到控制台:

using System;
using System.Runtime.InteropServices;
using Microsoft.Diagnostics.Tracing; // you need to add the Microsoft.Diagnostics.Tracing.TraceEvent nuget package
using Microsoft.Diagnostics.Tracing.Session;

namespace TraceTest
{
    class Program
    {
        static void Main()
        {
            // create a real time user mode session
            using (var session = new TraceEventSession("MySession"))
            {
                // use UWP logging channel provider
                session.EnableProvider(new Guid("01234567-01234-01234-01234-012345678901")); // use the same guid as for your LoggingChannel

                session.Source.AllEvents += Source_AllEvents;

                // Set up Ctrl-C to stop the session
                Console.CancelKeyPress += (object s, ConsoleCancelEventArgs a) => session.Stop();

                session.Source.Process();   // Listen (forever) for events
            }
        }

        private static void Source_AllEvents(TraceEvent obj)
        {
            // note: this is for the LoggingChannel.LogMessage Method only! you may crash with other providers or methods
            var len = (int)(ushort)Marshal.ReadInt16(obj.DataStart);
            var stringMessage = Marshal.PtrToStringUni(obj.DataStart + 2, len / 2);

            // Output the event text message. You could filter using level.
            // TraceEvent also contains a lot of useful informations (timing, process, etc.)
            Console.WriteLine(obj.Level + ":" + stringMessage);
        }
    }
}

0
我想补充一点,debug.writeline 似乎最好在主线程上工作,所以如果使用异步/等待,请使用类似 Device.BeginInvokeOnMainThread(() => Debug.WriteLine(response)); 的方法打印到控制台。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接