MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Вывод в консоль в Visual Studio 2017"
Answer 890779
На самом деле консольный вывод, разумеется, никак не привязан к версии студии. Но многие методы класса Console, несмотря на название, выводят не в консоль, а в стандартный поток вывода, и никто не обещал, что он не будет перенаправлен. Так вот, в Visual Studio 2017 причина как будто именно в этом - при запуске под отладчиком стандартный вывод студия перенаправляет для каких-то своих целей.
Можно пересоздать stdout, так чтобы он выводил напрямую в консоль:
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Controls; #pragma warning disable CS0618 namespace WpfApp1 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool AllocConsole(); [DllImport("kernel32.dll", SetLastError = true)] internal static extern uint GetConsoleCP(); const uint GENERIC_READ = 0x80000000; const uint GENERIC_WRITE = 0x40000000; const uint FILE_SHARE_READ = 0x00000001; const uint FILE_SHARE_WRITE = 0x00000002; const uint OPEN_EXISTING = 3; const uint FILE_ATTRIBUTE_NORMAL = 0x00000080; [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr CreateFile( [MarshalAs(UnmanagedType.LPTStr)] string filename, [MarshalAs(UnmanagedType.U4)] uint access, [MarshalAs(UnmanagedType.U4)] uint share, IntPtr securityAttributes, [MarshalAs(UnmanagedType.U4)] uint creationDisposition, [MarshalAs(UnmanagedType.U4)] uint flagsAndAttributes, IntPtr templateFile); public static bool CreateConsole() { bool res = AllocConsole(); //создаем консоль if (res == false) return false; uint cp = GetConsoleCP(); //получаем кодировку консоли //получаем дескриптор консоли var handle = CreateFile("CONOUT$", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero); if (handle.ToInt64() == -1) { throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); } //Пересоздаем stdout Stream s = new FileStream(handle, FileAccess.Write); StreamWriter wr = new StreamWriter( s, Encoding.GetEncoding((int)cp)); wr.AutoFlush = true; System.Console.SetOut(wr); return true; } private void Button_Click(object sender, RoutedEventArgs e) { bool res = CreateConsole(); if (res == false) MessageBox.Show("Failed to create console"); Console.WriteLine("Hello from WPF!"); } } }
Используйте на свой страх и риск, я понятия не имею, что может сломаться от подобных извращений. Вообще, непонятно зачем тут вообще нужна именно консоль: в ней нет ничего особенно удобного для целей отладки. Вы могли бы вместо этого использовать вывод в System.Diagnostics.Debug в отладочной конфигурации (
#if DEBUG
) и обычное окно с TextBox в релизной.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.