web-dev-qa-db-fra.com

Comment sortir sur console dans UWP sur Windows 10?

Existe-t-il un moyen d'écrire dans la commande/invite Prompt/powershell (comme Console.WriteLine()) ou quelque chose de similaire dans les applications UWP?

Si la console est indisponible, existe-t-il une alternative appropriée que je peux utiliser à la place pour écrire sur l'écran de grandes quantités de texte?

Bien sûr, je peux créer une commande XAML et la générer, mais cela ne semble pas être pratique par rapport à la simple Console.WriteLine().

Il y a aussi une très vieille discussion sur console WPF , mais rien ne semble fonctionner à partir de là (au moins, je n’ai pas trouvé Project-Properties-Application tab-Output Type-Console Application Et Trace.WriteLine("text") n’est pas disponible) .

42
Bad

Vous pouvez utiliser la méthode Debug.WriteLine à partir de l'espace de noms System.Diagnostics

lien MSDN

Lorsque vous commencez à déboguer votre application, ces messages sont affichés dans la fenêtre de sortie (le raccourci standard VS est Ctrl + Alt + O, ReSharper le raccourci est Ctrl + W, O)

63

En commençant par RS4 (la version à paraître mi-2018), vous pouvez créer des applications en ligne de commande avec UWP ou des informations de sortie sur la ligne de commande. La version préliminaire du SDK est déjà disponible et vous pouvez regarder un vidéo de la chaîne 9 .

3
Peter Torr - MSFT

Vous pouvez utiliser le classe LoggingChannel . pour créer ETW événements de trace.

Le truc cool avec LoggingChannel est que vous pouvez faire des traces sophistiquées (et utiliser des outils avancés comme PerfView , etc.), mais vous pouvez aussi avoir un équivalent simple de Debug.WriteLine en termes de simplicité avec la méthode LoggingChannel.LogMessage

public void LogMessage(String eventString)

ou

public void LogMessage(String eventString, LoggingLevel level)

Cela présente de nombreux avantages par rapport à Debug.WriteLine:

  • c'est beaucoup plus rapide, vous pouvez enregistrer facilement des millions de messages, tandis que Debug.WriteLine est un chien lent (basé sur la fonction OutputDebugString archaïque de Windows).
  • il ne bloque ni l'expéditeur ni le destinataire.
  • chaque canal est identifié par son propre guide, tandis que avec Debug.WriteLine vous obtenez toutes les traces de partout, tout le monde, c'est un peu compliqué de trouver les vôtres.
  • vous pouvez utiliser un niveau de trace (Critique, Erreur, Information, Verbose, Avertissement)
  • vous pouvez utiliser PerfView (si vous le souhaitez vraiment) ou Device Portal ou tout autre outil ETW .

Donc, pour envoyer des traces, ajoutez simplement ceci:

// 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!");
....

Maintenant, si vous voulez un moyen simple d’afficher ces traces sur votre machine locale, en plus d’utiliser PerfView ou d’autres outils ETW, vous pouvez utiliser un outil graphique gratuit open source que j’écris et qui s'appelle WpfTraceSpy, disponible ici: https: // github .com/smourier/TraceSpy # wpftracespy ou voici un exemple d'application .NET Framework Console qui générera toutes les traces et leur niveau sur la 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);
        }
    }
}
0
Simon Mourier