Как я могу добавить консольный вывод в приложение Windows wpf C # - PullRequest
4 голосов
/ 26 сентября 2011

Я хотел бы добавить дополнительное консольное окно для регистрации реальной информации из моего приложения wpf.Любая идея ??

Байо

ответ: Консольное приложение в свойствах проекта работает для меня.благодарственное в

Ответы [ 5 ]

4 голосов
/ 26 сентября 2011

Не делай этого.

Посмотрите на log4net или NLog для вывода журнала в файл.При правильной настройке этих платформ вы получаете гораздо больше возможностей (различные уровни журнала, автоматические отметки времени, автоматические имена классов перед каждой записываемой строкой)

И пока вы занимаетесь этим, вы также можете реализоватьсвой собственный фасад, чтобы скрыть используемую структуру ведения журнала от остальной части вашего кода.Это позволит вам легко изменить структуру ведения журнала, если и когда возникнет такая необходимость.


Если вы хотите иметь консоль и окно GUI для вашей программы, вы можете реализовать это поведение, скомпилировав проект как console application (csc /target:exe).Но будьте осторожны: это, безусловно, приводит к плохому удобству использования, потому что никто не ожидает, что ваше приложение будет иметь как консоль, так и окно с графическим интерфейсом.

2 голосов
/ 26 сентября 2011

Вы можете вызвать AttachConsole WIN API, а затем вызвать эту функцию, используя PInvoke:

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AttachConsole(uint dwProcessId);

const uint ATTACH_PARENT_PROCESS = 0x0ffffffff;  // default value if not specifing a process ID

// Somewhere in main method
AttachConsole(ATTACH_PARENT_PROCESS);
1 голос
/ 11 апреля 2015

Спасибо за идеи выше.Вот все шаги, необходимые для добавления окна консоли в приложение WPF.Мы изменили наше тестовое приложение WPF, чтобы оно могло вызываться из командной строки во время ночного процесса тестирования.Единственный сбой - когда приложение запускается из консоли, командная строка не сразу записывается в окно консоли после вызова FreeConsole () и выхода из нашего приложения.Похоже, что в функции FreeConsole () отсутствует вызов функции типа Flush () для принудительной записи командной строки в окно консоли.Я считаю, что история стрелок вверх / вниз окна консоли доступна, и консоль принимает другую команду, но когда следующее приложение запускается и пишет в окно консоли, пропущенная командная строка записывается вместе с ним.

  1. На вкладке «Свойства» проекта проекта оставьте «Тип вывода» = «Приложение Windows».
  2. Щелкните правой кнопкой мыши файл App.xaml и выберите «Свойства»
  3. Установите действие сборки = Page
  4. Откройте App.xaml.cs и измените класс App, как показано ниже.

    public partial class App : Application
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool AttachConsole(uint dwProcessId);
    
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool FreeConsole();
    
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        internal static extern int GetConsoleTitle(System.Text.StringBuilder sbTitle, int capacity);
    
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        internal static extern bool SetConsoleTitle(string sTitle);
    
        [STAThread]
        public static int Main(string[] args)
        {
            Boolean hasExceptionOccured = false;
    
            System.Text.StringBuilder sbTitle = new System.Text.StringBuilder();
    
            try
            {
                // If the user does not provide any parameters assume they want to run in GUI mode.
                if (0 == args.Length)
                {
                    var application = new App();
                    application.InitializeComponent();
                    application.Run();
                }
                else
                {
                    const uint ATTACH_PARENT_PROCESS = 0x0ffffffff;  // Default value if not specifying a process ID.
    
                    // Attach to the console which launched this application.
                    AttachConsole(ATTACH_PARENT_PROCESS);
    
                    // Get the current title of the console window.
                    GetConsoleTitle(sbTitle, 64);
    
                    // Set the console title to the name and version of this application.
                    SetConsoleTitle(Global.thisProgramsName + " - v" + Global.thisProductVersion);
    
                    // Create a instance of your console class and call it’s Run() method.
                    var mainConsole = new ReportTester.MainConsole();
                    mainConsole.Run(args);                   
                }
            }
            catch (System.Exception ex)
            {
                System.Console.WriteLine(ex.Message);
                System.Console.WriteLine(ex.StackTrace);
                if (null != ex.InnerException)
                {
                    System.Console.WriteLine(ex.InnerException.Message);
                    System.Console.WriteLine(ex.InnerException.StackTrace);
                }
                hasExceptionOccured = true;
            }
            finally
            {
                // Since the console does not display the prompt when freed, we will provide one here.
                System.Console.Write(">");
    
                // Restore the console title.
                SetConsoleTitle(sbTitle.ToString());
    
                // Free the console.
                FreeConsole();
            }
    
            return (hasExceptionOccured ? 1 : 0);
        }
    }
    
0 голосов
/ 26 апреля 2019

Если вы хотите иметь консоль и окно графического интерфейса для вашей программы, вы можете реализовать это, скомпилировав проект как консольное приложение.

Просто зайдите в свойства вашего проекта и измените тип вывода на console application

Теперь при запуске вы получите как окно WPF, так и окно консоли.

0 голосов
/ 09 января 2019

Требования не ясны.Звучит так, как будто единственное реальное требование - иметь возможность перенаправить стандартный вывод;Похоже, что нет необходимости в окне консоли.

В пустом (новом) приложении WPF добавьте следующее к событию Loaded или что-то еще:

Stream StdoutStream = OpenStandardOutput();
StreamWriter Stdout = new StreamWriter(StdoutStream);
Stdout.WriteLine("Line one");
Stdout.WriteLine("Line two");
Stdout.WriteLine("Hello");
Stdout.WriteLine("Bye");
Stdout.Flush();
Stdout.Close();

Затем запустите программу изкомандную строку и перенаправить стандартный вывод в файл.Вывод будет в файле.Стандартный ввод может быть перенаправлен соответствующим образом.

Это может быть очень полезно в ситуациях, когда стандартный ввод-вывод является требованием, которое мы не можем контролировать.У нас может быть окно графического интерфейса в сочетании со стандартным вводом-выводом.

...