Domanda

Sto utilizzando Console.WriteLine () da un'applicazione di test WPF molto semplice, ma quando eseguo l'applicazione dalla riga di comando, non vedo nulla da scrivere sulla console. Qualcuno sa cosa potrebbe succedere qui?

Posso riprodurlo creando un'applicazione WPF in VS 2008 e semplicemente aggiungendo Console.WriteLine (" text ") ovunque venga eseguito. Qualche idea?

Tutto ciò di cui ho bisogno in questo momento è qualcosa di semplice come Console.WriteLine (). Mi rendo conto che potrei usare log4net o qualcos'altro soluzione di registrazione, ma non ho davvero bisogno di molte funzionalità per questa applicazione.

Modifica: avrei dovuto ricordare che Console.WriteLine () è per le applicazioni console. Oh bene, nessuna domanda stupida, vero? :-) Per ora userò semplicemente System.Diagnostics.Trace.WriteLine () e DebugView.

È stato utile?

Soluzione

Dovrai creare una finestra della console manualmente prima di chiamare qualsiasi metodo Console.Write. Ciò consentirà alla Console di funzionare correttamente senza modificare il tipo di progetto (che per l'applicazione WPF non funzionerà).

Ecco un esempio completo di codice sorgente, di come potrebbe apparire una classe ConsoleManager e come può essere usata per abilitare / disabilitare la Console, indipendentemente dal tipo di progetto.

Con la seguente classe, devi solo scrivere ConsoleManager.Show () da qualche parte prima di qualsiasi chiamata a Console.Write ...

[SuppressUnmanagedCodeSecurity]
public static class ConsoleManager
{
    private const string Kernel32_DllName = "kernel32.dll";

    [DllImport(Kernel32_DllName)]
    private static extern bool AllocConsole();

    [DllImport(Kernel32_DllName)]
    private static extern bool FreeConsole();

    [DllImport(Kernel32_DllName)]
    private static extern IntPtr GetConsoleWindow();

    [DllImport(Kernel32_DllName)]
    private static extern int GetConsoleOutputCP();

    public static bool HasConsole
    {
        get { return GetConsoleWindow() != IntPtr.Zero; }
    }

    /// <summary>
    /// Creates a new console instance if the process is not attached to a console already.
    /// </summary>
    public static void Show()
    {
        //#if DEBUG
        if (!HasConsole)
        {
            AllocConsole();
            InvalidateOutAndError();
        }
        //#endif
    }

    /// <summary>
    /// If the process has a console attached to it, it will be detached and no longer visible. Writing to the System.Console is still possible, but no output will be shown.
    /// </summary>
    public static void Hide()
    {
        //#if DEBUG
        if (HasConsole)
        {
            SetOutAndErrorNull();
            FreeConsole();
        }
        //#endif
    }

    public static void Toggle()
    {
        if (HasConsole)
        {
            Hide();
        }
        else
        {
            Show();
        }
    }

    static void InvalidateOutAndError()
    {
        Type type = typeof(System.Console);

        System.Reflection.FieldInfo _out = type.GetField("_out",
            System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);

        System.Reflection.FieldInfo _error = type.GetField("_error",
            System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);

        System.Reflection.MethodInfo _InitializeStdOutError = type.GetMethod("InitializeStdOutError",
            System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);

        Debug.Assert(_out != null);
        Debug.Assert(_error != null);

        Debug.Assert(_InitializeStdOutError != null);

        _out.SetValue(null, null);
        _error.SetValue(null, null);

        _InitializeStdOutError.Invoke(null, new object[] { true });
    }

    static void SetOutAndErrorNull()
    {
        Console.SetOut(TextWriter.Null);
        Console.SetError(TextWriter.Null);
    }
} 

Altri suggerimenti

Fai clic con il pulsante destro del mouse sul progetto, " Proprietà " ;, " Applicazione " scheda, modifica " Tipo di output " a " Applicazione console " ;, e quindi avrà anche una console.

Puoi usare

Trace.WriteLine("text");

Verrà emesso in " Output " finestra in Visual Studio (durante il debug).

assicurarsi di avere incluso il gruppo Diagnostics:

using System.Diagnostics;

Sebbene John Leidegren continui a sminuire l'idea, Brian ha ragione. Ho appena funzionato in Visual Studio.

Per essere chiari, un'applicazione WPF non crea una finestra della console per impostazione predefinita.

Devi creare un'applicazione WPF e quindi modificare OutputType in " Console Application " ;. Quando esegui il progetto vedrai una finestra della console con la tua finestra WPF di fronte.

Non sembra molto carino, ma l'ho trovato utile perché volevo che la mia app venisse eseguita dalla riga di comando con feedback lì dentro, e quindi per alcune opzioni di comando visualizzerei la finestra di WPF.

È possibile visualizzare l'output destinato alla console utilizzando reindirizzamento della riga di comando .

Ad esempio:

C:\src\bin\Debug\Example.exe > output.txt

scriverà tutto il contenuto nel file output.txt .

Vecchio post, ma mi sono imbattuto in questo, quindi se stai provando a produrre qualcosa in Output in un progetto WPF in Visual Studio, il metodo contemporaneo è:

Includi questo:

using System.Diagnostics;

E poi:

Debug.WriteLine("something");

Uso Console.WriteLine () per l'uso nella finestra Output ...

Ho creato una soluzione, mescolato le informazioni di varius post.

È un modulo, che contiene un'etichetta e una casella di testo. L'output della console viene reindirizzato alla casella di testo.

Esiste anche una classe chiamata ConsoleView che implementa tre metodi pubblici: Show (), Close () e Release (). L'ultimo è per lasciare aperta la console e attivare il pulsante Chiudi per visualizzare i risultati.

I moduli si chiamano FrmConsole. Ecco XAML e il codice c #.

L'uso è molto semplice:

ConsoleView.Show("Title of the Console");

Per aprire la console. Usa:

System.Console.WriteLine("The debug message");

Per l'output del testo sulla console.

Usa:

ConsoleView.Close();

Per chiudere la console.

ConsoleView.Release();

Lascia aperta la console e abilita il pulsante Chiudi

XAML

<Window x:Class="CustomControls.FrmConsole"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:CustomControls"
    mc:Ignorable="d"
    Height="500" Width="600" WindowStyle="None" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" Topmost="True" Icon="Images/icoConsole.png">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="40"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="40"/>
    </Grid.RowDefinitions>
    <Label Grid.Row="0" Name="lblTitulo" HorizontalAlignment="Center" HorizontalContentAlignment="Center" VerticalAlignment="Center" VerticalContentAlignment="Center" FontFamily="Arial" FontSize="14" FontWeight="Bold" Content="Titulo"/>
    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="10"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="10"/>
        </Grid.ColumnDefinitions>
        <TextBox Grid.Column="1" Name="txtInner" FontFamily="Arial" FontSize="10" ScrollViewer.CanContentScroll="True" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible" TextWrapping="Wrap"/>
    </Grid>
    <Button Name="btnCerrar" Grid.Row="2" Content="Cerrar" Width="100" Height="30" HorizontalAlignment="Center" HorizontalContentAlignment="Center" VerticalAlignment="Center" VerticalContentAlignment="Center"/>
</Grid>

Il codice della finestra:

partial class FrmConsole : Window
{
    private class ControlWriter : TextWriter
    {
        private TextBox textbox;
        public ControlWriter(TextBox textbox)
        {
            this.textbox = textbox;
        }

        public override void WriteLine(char value)
        {
            textbox.Dispatcher.Invoke(new Action(() =>
            {
                textbox.AppendText(value.ToString());
                textbox.AppendText(Environment.NewLine);
                textbox.ScrollToEnd();
            }));
        }

        public override void WriteLine(string value)
        {
            textbox.Dispatcher.Invoke(new Action(() =>
            {
                textbox.AppendText(value);
                textbox.AppendText(Environment.NewLine);
                textbox.ScrollToEnd();
            }));
        }

        public override void Write(char value)
        {
            textbox.Dispatcher.Invoke(new Action(() =>
            {
                textbox.AppendText(value.ToString());
                textbox.ScrollToEnd();
            }));
        }

        public override void Write(string value)
        {
            textbox.Dispatcher.Invoke(new Action(() =>
            {
                textbox.AppendText(value);
                textbox.ScrollToEnd();
            }));
        }

        public override Encoding Encoding
        {
            get { return Encoding.UTF8; }

        }
    }

    //DEFINICIONES DE LA CLASE
    #region DEFINICIONES DE LA CLASE

    #endregion


    //CONSTRUCTORES DE LA CLASE
    #region CONSTRUCTORES DE LA CLASE

    public FrmConsole(string titulo)
    {
        InitializeComponent();
        lblTitulo.Content = titulo;
        Clear();
        btnCerrar.Click += new RoutedEventHandler(BtnCerrar_Click);
        Console.SetOut(new ControlWriter(txtInner));
        DesactivarCerrar();
    }

    #endregion


    //PROPIEDADES
    #region PROPIEDADES

    #endregion


    //DELEGADOS
    #region DELEGADOS

    private void BtnCerrar_Click(object sender, RoutedEventArgs e)
    {
        Close();
    }

    #endregion


    //METODOS Y FUNCIONES
    #region METODOS Y FUNCIONES

    public void ActivarCerrar()
    {
        btnCerrar.IsEnabled = true;
    }

    public void Clear()
    {
        txtInner.Clear();
    }

    public void DesactivarCerrar()
    {
        btnCerrar.IsEnabled = false;
    }

    #endregion  
}

il codice della classe ConsoleView

static public class ConsoleView
{
    //DEFINICIONES DE LA CLASE
    #region DEFINICIONES DE LA CLASE
    static FrmConsole console;
    static Thread StatusThread;
    static bool isActive = false;
    #endregion

    //CONSTRUCTORES DE LA CLASE
    #region CONSTRUCTORES DE LA CLASE

    #endregion

    //PROPIEDADES
    #region PROPIEDADES

    #endregion

    //DELEGADOS
    #region DELEGADOS

    #endregion

    //METODOS Y FUNCIONES
    #region METODOS Y FUNCIONES

    public static void Show(string label)
    {
        if (isActive)
        {
            return;
        }

        isActive = true;
        //create the thread with its ThreadStart method
        StatusThread = new Thread(() =>
        {
            try
            {
                console = new FrmConsole(label);
                console.ShowDialog();
                //this call is needed so the thread remains open until the dispatcher is closed
                Dispatcher.Run();
            }
            catch (Exception)
            {
            }
        });

        //run the thread in STA mode to make it work correctly
        StatusThread.SetApartmentState(ApartmentState.STA);
        StatusThread.Priority = ThreadPriority.Normal;
        StatusThread.Start();

    }

    public static void Close()
    {
        isActive = false;
        if (console != null)
        {
            //need to use the dispatcher to call the Close method, because the window is created in another thread, and this method is called by the main thread
            console.Dispatcher.InvokeShutdown();
            console = null;
            StatusThread = null;
        }

        console = null;
    }

    public static void Release()
    {
        isActive = false;
        if (console != null)
        {
            console.Dispatcher.Invoke(console.ActivarCerrar);
        }

    }
    #endregion
}

Spero che questo risultato sia utile.

Dai un'occhiata a questo post, è stato molto utile per me stesso. Scarica l'esempio di codice:

http://www.codeproject.com/ articoli / 335.909 / Embedding-a-console-in-aC-Application

Per quanto ne so, Console.WriteLine () è solo per applicazioni console. Penso che questo sia il tuo problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top