Нет вывода на консоль из приложения WPF?
Я использую консоль.WriteLine () из очень простого тестового приложения WPF, но когда я выполняю приложение из командной строки, я не вижу ничего, что записывается в консоль. Кто-нибудь знает, что здесь происходит?
Я могу воспроизвести его, создав приложение WPF в VS 2008 и просто добавив консоль.WriteLine ("текст") в любом месте, которое выполняется. Есть идеи?
все, что мне нужно прямо сейчас, это что-то простое, как консоль.метод WriteLine.)( Я понимаю, что я может использовать log4net или somet другое решение для ведения журнала, но мне действительно не нужно столько функциональности для этого приложения.
Edit: Я должен был помнить эту консоль.WriteLine () предназначен для консольных приложений. Ну ладно, никаких глупых вопросов, верно? :-) Я просто использую систему.Диагностика.След.WriteLine () и DebugView на данный момент.
10 ответов:
вам придется создать окно консоли вручную, прежде чем вы фактически вызовете любую консоль.Напишите методы. Это приведет к правильной работе консоли без изменения типа проекта (который для приложения WPF не будет работать).
вот полный пример исходного кода, как может выглядеть класс ConsoleManager и как его можно использовать для включения/выключения консоли независимо от типа проекта.
С помощью следующего класса, вам просто нужно написать
ConsoleManager.Show()
где-то перед любым звонком в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); } }
щелкните правой кнопкой мыши на проекте, вкладке" свойства"," приложение", измените" тип вывода "на" консольное приложение", а затем у него также будет консоль.
можно использовать
Trace.WriteLine("text");
это выведет в окно "вывод" в Visual Studio (при отладке).
убедитесь, что сборка диагностики входит:
using System.Diagnostics;
хотя Джон Лейдегрен продолжает сбивать идею, Брайан прав. Я только что получил его работу в Visual Studio.
чтобы очистить приложение WPF не создает окно консоли по умолчанию.
вы должны создать приложение WPF, а затем изменить OutputType на "консольное приложение". При запуске проекта вы увидите окно консоли с окном WPF перед ним.
Это выглядит не очень красиво, но я нашел его полезным, как я хотел, чтобы мое приложение запускалось из командной строки с обратной связью там, а затем для определенных параметров команды я бы отображал окно WPF.
можно увидеть вывод, предназначенный для консоли с помощью командная строка переадресации.
например:
C:\src\bin\Debug\Example.exe > output.txt
будет писать все содержимое в .
старый пост, но я столкнулся с этим, поэтому, если вы пытаетесь вывести что-то для вывода в проекте WPF в Visual Studio, современный метод:
включить так:
using System.Diagnostics;
и затем:
Debug.WriteLine("something");
Я создал решение, смешал информацию о varius post.
его форма, которая содержит метку и одно текстовое поле. Вывод консоли перенаправляется в текстовое поле.
существует также класс ConsoleView, который реализует три метода publics: Show(), Close () и Release(). Последний - для того, чтобы оставить консоль открытой и активировать кнопку закрытия для просмотра результатов.
формы называется FrmConsole. Вот XAML и c# код.
использование очень простое:
ConsoleView.Show("Title of the Console");
для открытия консоли. Использование:
System.Console.WriteLine("The debug message");
для вывода текста в консоль.
использование:
ConsoleView.Close();
для закрытия консоли.
ConsoleView.Release();
оставляет открытой консоль и включает кнопку Закрыть
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>
код окна:
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 }
код класса 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 }
Я надеюсь, что это результат полезный.
проверьте этот пост, было очень полезно для себя. Загрузите пример кода:
http://www.codeproject.com/Articles/335909/Embedding-a-Console-in-a-C-Application