Pergunta

Eu estou usando Console.WriteLine () a partir de um aplicativo de teste WPF muito simples, mas quando eu executar o aplicativo a partir da linha de comando, eu estou vendo nada sendo gravados no console. Alguém sabe o que poderia estar acontecendo aqui?

Eu posso reproduzi-lo através da criação de um aplicativo WPF no VS 2008, e simplesmente adicionando Console.WriteLine ( "text") em qualquer lugar que se executado. Alguma idéia?

Tudo que eu preciso para agora é algo tão simples como Console.WriteLine (). Eu percebo que eu poderia usar log4net ou somet outra solução de log, mas eu realmente não precisa que muita funcionalidade para esta aplicação.

Editar: Eu deveria ter lembrado que Console.WriteLine () é para aplicativos de console. Oh bem, há perguntas estúpidas, certo? :-) Eu só vou usar System.Diagnostics.Trace.WriteLine () e DebugView para agora.

Foi útil?

Solução

Você terá que criar uma janela Console manualmente antes de realmente chamar quaisquer métodos Console.Write. Que irá inicializar o Console de funcionar adequadamente sem mudar o tipo de projeto (que, para aplicação WPF não vai funcionar).

Aqui está um exemplo completo de código fonte, de como uma classe ConsoleManager pode parecer, e como ele pode ser usado para ativar / desativar o Console, independentemente do tipo de projeto.

Com a seguinte classe, você só precisa algum lugar write ConsoleManager.Show() antes de qualquer chamada para 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);
    }
} 

Outras dicas

Botão direito do mouse sobre o projeto, "Propriedades", "Application" guia, alterar "Tipo de saída" para "Console Application", e em seguida, ele também terá um console.

Você pode usar

Trace.WriteLine("text");

A saída será para a janela "Output" no Visual Studio (quando a depuração).

Certifique-se de ter os diagnósticos de montagem incluído:

using System.Diagnostics;

Embora John Leidegren continua derrubando a idéia, Brian está correto. Eu só tenho que trabalhar no Visual Studio.

Para ser claro uma aplicação WPF não cria uma janela Console por padrão.

Você tem que criar um aplicativo WPF e altere a OutputType para "Console Application". Quando você executar o projeto, você verá uma janela de consola com sua janela WPF em frente a ela.

Não parece muito bonito, mas eu achei útil como eu queria meu aplicativo para ser executado a partir da linha de comando com o feedback lá, e, em seguida, para determinadas opções de comando Gostaria de exibir a janela do WPF.

É possível ver saída destinados a console usando href="http://technet.microsoft.com/en-us/library/bb490982.aspx" redirecionamento .

Por exemplo:

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

vai escrever todo o conteúdo para o arquivo output.txt.

Post antigo, mas eu corri para este por isso, se você está tentando imprimir algo a saída em um projeto WPF no Visual Studio, o método contemporânea é:

Incluir este:

using System.Diagnostics;

E, em seguida:

Debug.WriteLine("something");

Eu uso Console.WriteLine () para uso na janela de saída ...

Eu tenho criar uma solução, misturado a informação de pós varius.

Sua um formulário, que contém um rótulo e uma caixa de texto. A saída do console é redirecionado para a caixa de texto.

Há também uma classe chamada ConsoleView que implementa três públicos métodos: show (), Close () e Release (). A última é a licença abrir o console e ativar o botão Fechar para resultados de vista.

As formas é chamado FrmConsole. Aqui estão o XAML eo código c #.

O uso é muito simples:

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

Para abrir o console. Use:

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

Para texto de saída para o console.

Use:

ConsoleView.Close();

Para fechar o console.

ConsoleView.Release();

Folhas de abrir o console e permite que o botão Fechar

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>

O código da janela:

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  
}

o código de 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
}

Espero que este util resultado.

Confira este post, foi muito útil para mim. Faça o download do código de exemplo:

http://www.codeproject.com/ artigos / 335909 / Embedding-a-Console-in-aC-Aplicação

Tanto quanto eu sei, Console.WriteLine () é apenas para aplicativos de console. Acho que este é o seu problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top