Подтвердить что ты не робот

Как выводить на консоль в UWP в Windows 10?

Есть ли способ записать в консоль/командную строку /powershell (например, Console.WriteLine()) или что-нибудь подобное в приложениях UWP?

Если консоль недоступна, есть ли подходящая альтернатива, которую я могу использовать вместо этого, чтобы написать на экран большие объемы текста?

Я, конечно, могу сделать элемент управления XAML и выводить на него, но он не кажется удобным для сравнения с простым Console.WriteLine().

Существует также очень старое обсуждение консоли WPF, но оттуда ничего не работает (по крайней мере, я не смог найти Project-Properties-Application tab-Output Type-Console Application и Trace.WriteLine("text") недоступен).

4b9b3361

Ответ 1

Вы можете использовать метод Debug.WriteLine из пространства имен System.Diagnostics

Ссылка MSDN

При запуске отладки вашего приложения эти сообщения будут отображаться в окне вывода (стандартный ярлык VS - Ctrl + Alt + O, ReSharper ярлык Ctrl + W, O)

Ответ 2

Начиная с RS4 (релиз выйдет в середине 2018 года), вы можете создавать приложения командной строки с UWP или выводить информацию в командную строку. Предварительный релиз SDK уже доступен, и вы можете посмотреть видео 9-го канала.

Ответ 3

Вы можете использовать класс LoggingChannel. создавать 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).
  • он не блокирует ни отправителя, ни получателя.
  • каждый канал идентифицируется по своему собственному руководству, в то время как с Debug.WriteLine вы получаете все следы отовсюду, у всех, немного сложно найти свои собственные.
  • Вы можете использовать уровень трассировки (Критический, Ошибка, Информация, Подробный, Предупреждение)
  • Вы можете использовать PerfView (если вы действительно этого хотите), Портал устройств или любой другой инструмент 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 yours!

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

Теперь, если вам нужен простой способ отображения этих следов на вашем локальном компьютере, помимо использования PerfView или других инструментов ETW, вы можете использовать бесплатный графический инструмент с открытым исходным кодом, который я пишу, под названием 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);
        }
    }
}