Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Проект на WinForms перехватить Console.WriteLine  [new]
Новичок ООП..
Member

Откуда:
Сообщений: 65
Привет, форумчане!
Я в своём проекте (WinForms Net Framework 4.6.2) использую стороннюю dll-сборку, установленную через NuGet Package Manager.
Когда я смотрел исходники этой сборки, там в методах некоторых классов есть вызовы Console.WriteLine("строковое сообщение"). Как можно перехватить сообщения, отправляемые с помощью Console.WriteLine, так, чтобы я мог эти сообщения отобразить, например, в каком-нибудь TextBox моего проекта на WinForms?
14 мар 19, 10:41    [21832148]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3303
Новичок ООП..,

Stdin\stdout в классе Console есть TextWriter и TextReader
14 мар 19, 10:50    [21832159]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26465
Новичок ООП..
Как можно перехватить сообщения, отправляемые с помощью Console

Console.SetOut(TextWriter) Method
Там и пример есть
14 мар 19, 12:19    [21832343]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145559
Новичок ООП..
там в методах некоторых классов есть вызовы Console.WriteLine("строковое сообщение").

Это заглушки, которые забыли выпилить из исходников
14 мар 19, 14:49    [21832653]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
Новичок ООП..
Member

Откуда:
Сообщений: 65
Cat2
Это заглушки, которые забыли выпилить из исходников
нет, не заглушки. Там вполне осмысленная информация передаётся, ну и отладочные сообщения.

Я понимаю, что Console.Write можно перенаправить в TextWriter но как потом из этого TextWriter извлечь строки и перекинуть их на TextBox ?
14 мар 19, 15:16    [21832697]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3303
Новичок ООП..,

для таких вещей есть логирование, которое можно настроить на вывода в stdout, в файл или куда угодно еще.
14 мар 19, 15:18    [21832702]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
Новичок ООП..
Member

Откуда:
Сообщений: 65
Roman Mejtes
куда угодно еще
мне не нужно куда угодно - мне нужно вывести текст в элемент управления "Мемо-поле" (здесь он называется TextBox)
Вы можете привести пример кода, как из TextWriter вытащить накопленный там текст в TextBox ?
14 мар 19, 16:06    [21832772]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3303
Новичок ООП..
Roman Mejtes
куда угодно еще
мне не нужно куда угодно - мне нужно вывести текст в элемент управления "Мемо-поле" (здесь он называется TextBox)
Вы можете привести пример кода, как из TextWriter вытащить накопленный там текст в TextBox ?


На форме только TextBox с именем textBox1, конечно такой вариант не очень хороший, так как я удерживаю постоянно ссылку на этот текст бокс и когда окно закроется, ссылка сохранится. Лучше сделать какую то перемычку и слабые ссылки или связывание, а текст форматировать в VM или как там у вас всё работает.
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApp3
{
    internal class TextBoxWriter : TextWriter
    {
        private readonly TextBox _textBox;
        public TextBoxWriter(TextBox textBox)
        {
            _textBox = textBox;
        }

        public override Encoding Encoding => Encoding.UTF8;

        public override void WriteLine(string value)
        {
            _textBox.Text += value + Environment.NewLine;
            _textBox.Select(_textBox.Text.Length, 0);
            _textBox.ScrollToCaret();
            base.WriteLine(value);
        }
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            var myTextWriter = new TextBoxWriter(textBox1);
            Console.SetOut(myTextWriter);
            var timer = new Timer() { Interval = 500 };
            timer.Tick += Timer_Tick;
            timer.Start();
        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            this.Invoke(new Action(OnWriter));
        }

        private void OnWriter()
        {
            Console.WriteLine(DateTime.UtcNow.ToString());
        }
    }
}
14 мар 19, 16:34    [21832805]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 2562
Новичок ООП..
Cat2
Это заглушки, которые забыли выпилить из исходников
нет, не заглушки. Там вполне осмысленная информация передаётся, ну и отладочные сообщения.

Я понимаю, что Console.Write можно перенаправить в TextWriter но как потом из этого TextWriter извлечь строки и перекинуть их на TextBox ?


а можно еще так, не проверял, но:

пускаем приложение руками
>app >myconsole.txt

оно ставит файл на проверку на изменение, читает файл и, если изменился - текст из него выдает на контрол

14 мар 19, 16:38    [21832814]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
Изопропил
Member

Откуда:
Сообщений: 31078
Новичок ООП..
Привет, форумчане!
Я в своём проекте (WinForms Net Framework 4.6.2) использую стороннюю dll-сборку, установленную через NuGet Package Manager.
Когда я смотрел исходники этой сборки, там в методах некоторых классов есть вызовы Console.WriteLine("строковое сообщение"). Как можно перехватить сообщения, отправляемые с помощью Console.WriteLine, так, чтобы я мог эти сообщения отобразить, например, в каком-нибудь TextBox моего проекта на WinForms?

внести изменения в исходники
14 мар 19, 17:02    [21832849]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
Новичок ООП..
Member

Откуда:
Сообщений: 65
Roman Mejtes, Спасибо за ваш код - чуть позже попробую проверить его в работе.
Кстати, будет ли он работать если в Console.Write фигачат из нескольких потоков (явно не UI-потоков) ?
14 мар 19, 17:36    [21832881]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
Новичок ООП..
Member

Откуда:
Сообщений: 65
Изопропил
внести изменения в исходники
в принципе это правильно, но дело вот в чём - код я взял у чувака с гитхаба - и что, если он будет вносить изменения (обновления), мне каждый раз лезть править исходники?
14 мар 19, 17:38    [21832885]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3303
Новичок ООП..
Roman Mejtes, Спасибо за ваш код - чуть позже попробую проверить его в работе.
Кстати, будет ли он работать если в Console.Write фигачат из нескольких потоков (явно не UI-потоков) ?

сделайте Writer его потокобезопасным, обновляйте TextBox в UI потоке, добавьте StringBuilder в который вставляете новые строки, а потом этот StringBuilder выводите в TextBox. Так будет правильнее, я вам только пример кинул
14 мар 19, 17:38    [21832886]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
Изопропил
Member

Откуда:
Сообщений: 31078
Новичок ООП..,

Заменить Console.WriteLine по всему проекту несложно

Хуже будет, когда чувак прикрутит человеческий логгер.
14 мар 19, 20:25    [21833023]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
iskatelsql
Member

Откуда:
Сообщений: 778
Изопропил,

А, кстати, есть альтернатива этому Console.WriteLine? Если использую что-то от слова debug - сыпет в эвентсы, а мне удобно чтоб отдельно в аутпут - пишу в консоль.
15 мар 19, 00:25    [21833136]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
Новичок ООП..
Member

Откуда:
Сообщений: 65
Roman Mejtes, Спасибо за ваш ответ, всё получилось

+

объявил интерфейс
  public interface IOutputMessage
  {
    void OutputMessage(string message);
  }

ваш класс я переделал в более абстрактный вид
  internal class TTMyTextWriter : TextWriter
  {
    private readonly IOutputMessage outputMessageDevice;
    public TTMyTextWriter(IOutputMessage OutputMessageDevice)
    {
      outputMessageDevice = OutputMessageDevice;
    }

    public override Encoding Encoding => Encoding.UTF8;

    internal void OutputMessage(string message)
    {
      outputMessageDevice.OutputMessage(message);
      //base.WriteLine(message); // <--- No, no, no need to do that !
    }

    public override void WriteLine(string value) => OutputMessage(value);

    public override void Write(string value) => OutputMessage(value);

  }



затем реализовал интерфейс IOutputMessage в форме
....
    private delegate void DelegateOutputMessage(string message);

    internal TTMyTextWriter MyTextWriter = null;
....
    public void OutputMessage(string message)
    {
      InnerOutputMessage(message);
    }

    private void InnerOutputMessage(string message)
    {
      if (TxtMessage.InvokeRequired)
      {
        DelegateOutputMessage d = new DelegateOutputMessage(OutputMessage);
        TxtMessage.Invoke(d, new object[] { message });
      }
      else
      {
        TxtMessage.AppendText(message + Environment.NewLine + Environment.NewLine);
      }
    }

при загрузке формы вызывается метод
    internal void RedirectConsoleOutput()
    {
      MyTextWriter = new TTMyTextWriter(this);
      Console.SetOut(MyTextWriter);
    }

15 мар 19, 08:02    [21833239]     Ответить | Цитировать Сообщить модератору
 Re: Проект на WinForms перехватить Console.WriteLine  [new]
Изопропил
Member

Откуда:
Сообщений: 31078
iskatelsql
Изопропил,

А, кстати, есть альтернатива этому Console.WriteLine? Если использую что-то от слова debug - сыпет в эвентсы, а мне удобно чтоб отдельно в аутпут - пишу в консоль.

iskatelsql
Изопропил,

А, кстати, есть альтернатива этому Console.WriteLine? Если использую что-то от слова debug - сыпет в эвентсы, а мне удобно чтоб отдельно в аутпут - пишу в консоль.

Альтернатива - логгер, например nlog

В качестве target можно использовать в частности MethodCall, FormControl, RichTextBox или создать свой target
15 мар 19, 08:07    [21833240]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить