web-dev-qa-db-ja.com

Windows 10のUWPでコンソールに出力する方法は?

Console/command Prompt/powershell(Console.WriteLine()など)またはUWPアプリで同様のものに書き込む方法はありますか?

コンソールが利用できない場合、画面に大量のテキストを書き込む代わりに使用できる適切な代替手段はありますか?

もちろん、XAMLコントロールを作成して出力することはできますが、単純なConsole.WriteLine()と比較すると便利ではないようです。

WPFコンソール に関する非常に古い議論もありますが、そこからは何も機能しないようです(少なくとも、_Project-Properties-Application tab-Output Type-Console Application_が見つからず、Trace.WriteLine("text")が利用できない)。

42
Bad

System.Diagnostics名前空間のDebug.WriteLineメソッドを使用できます。

MSDNリンク

アプリケーションのデバッグを開始すると、これらのメッセージが出力ウィンドウに表示されます(標準のVSショートカットはCtrl + Alt + O、 ReSharper ショートカットはCtrl + W、O)

63

RS4(2018年半ばにリリースされるリリース)以降、コマンドをビルドできます-UWPを備えたラインアプリまたはコマンドラインに情報を出力します。プレリリースSDKはすでに利用可能であり、 チャンネル9ビデオ を見ることができます。

3

LoggingChannel class を使用できます。 [〜#〜] etw [〜#〜] イベントを作成します。

LoggingChannelの素晴らしい点は、洗練されたトレースを実行できることです(そして PerfView などのような高度なツールを使用します)が、Debug.WriteLineの単純な同等物を LoggingChannel.LogMessageメソッド

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ツールを使用するだけでなく、ローカルマシンにこれらのトレースを表示する簡単な方法が必要な場合は、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
Simon Mourier