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

本文关键字:输出 控制台 UWP Windows | 更新日期: 2023-09-27 18:15:44

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

如果控制台不可用,是否有一个合适的替代方案,我可以用它来代替向屏幕上写入大量文本?

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

关于WPF控制台也有很老的讨论,但似乎没有任何工作(至少,我找不到Project-Properties-Application tab-Output Type-Console ApplicationTrace.WriteLine("text")不可用)。

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

可以使用Debug。从系统写入方法。诊断名称空间

MSDN联系

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

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

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

LoggingChannel最酷的地方是你可以做复杂的跟踪(并使用高级工具,如PerfView等),但你也可以用LoggingChannel有一个简单的相当于Debug.WriteLine的简单工具。LogMessage Method

public void LogMessage(String eventString)

public void LogMessage(String eventString, LoggingLevel level)

Debug.WriteLine相比,这有许多优点:

  • 它更快,你可以轻松地记录数百万条消息,而Debug.WriteLine是狗慢(基于古老的Windows的OutputDebugString函数)。
  • 不阻塞发送方或接收方。
  • 每个通道都由自己的guid标识,而使用Debug.WriteLine,您可以从任何地方获得所有痕迹,每个人,找到自己的痕迹有点混乱。
  • 您可以使用跟踪级别(关键,错误,信息,详细,警告)
  • 你可以使用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工具,你可以使用我写的一个免费的开源GUI工具,叫做WpfTraceSpy,可以在这里:https://github.com/smourier/TraceSpy#wpftracespy或这里是一个示例。net框架控制台应用程序,将输出所有的痕迹和他们的水平到控制台:

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);
        }
    }
}

我还想添加调试。writeline似乎最好在主线程上工作,所以如果使用async/await,使用Device.BeginInvokeOnMainThread(() => Debug.WriteLine(response));之类的东西打印到控制台