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

时间:2015-10-03 10:45:24

标签: c# xaml console windows-10 uwp

有没有办法写入控制台/命令提示符/ powershell(如Console.WriteLine())或UWP应用程序中的任何类似内容?

如果控制台不可用,是否有适当的替代方法,我可以使用它来写入大量文本?

当然,我可以对它进行XAML控制并输出,但与简单Console.WriteLine()相比,它似乎不方便。

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

4 个答案:

答案 0 :(得分:58)

您可以使用System.Diagnostics命名空间

中的Debug.WriteLine方法

MSDN Link

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

LoggingChannel的好处是您可以进行复杂的跟踪(并使用诸如PerfView之类的高级工具),但是就简单性而言,您也可以使用Debug.WriteLine来简单地等效于LoggingChannel.LogMessage Method

public void LogMessage(String eventString)

public void LogMessage(String eventString, LoggingLevel level)

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

  • 速度更快,Debug.WriteLine速度慢(基于古老的Windows的OutputDebugString功能),您可以轻松记录数百万条消息。
  • 它不会阻止发送者或接收者。
  • 每个频道都由自己的GUI标识,而使用Debug.WriteLine,您可以从任何地方(所有人)获得所有痕迹。
  • 您可以使用跟踪级别(严重,错误,信息,详细,警告)
  • 您可以使用PerfView(如果确实需要)或Device Portal或任何其他ETW tool

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

// 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 Framework Console应用程序,它将所有跟踪及其级别输出到控制台:

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

答案 3 :(得分:0)

我还想补充一下debug.writeline似乎在主线程上最好地工作,因此如果使用异步/等待,请使用Device.BeginInvokeOnMainThread(() => Debug.WriteLine(response));之类的内容打印到控制台