Скажем, я работаю над небольшим консольным приложением для пакетной обработки в VB.Net. Я хочу иметь возможность структурировать приложение следующим образом:
Sub WorkerMethod()
'Do some work
Trace.WriteLine("Work progress")
'Do more work
Trace.WriteLine("Another progress update")
'...
End Sub
Sub Main()
'Do any setup, like confirm the user wants to continue or whatever
WorkerMethod()
End Sub
Обратите внимание, что для вывода я использую Trace, а не Console. Это связано с тем, что рабочий метод может вызываться из другого места или даже находиться в другой сборке, и я хочу иметь возможность присоединять к нему разные прослушиватели трассировки. Итак, как мне подключить консоль к трассировке?
Я уже могу сделать это, определив простой класс (показанный ниже) и добавив экземпляр в коллекцию слушателей трассировки, но мне интересно, есть ли более принятый или встроенный способ для этого:
Public Class ConsoleTrace
Inherits Diagnostics.TraceListener
Public Overloads Overrides Sub Write(ByVal message As String)
Console.Write(message)
End Sub
Public Overloads Overrides Sub WriteLine(ByVal message As String)
Console.WriteLine(message)
End Sub
End Class





Вы можете добавить следующее в ваш EXE-файл .config.
<?xml version = "1.0"?>
<configuration>
<system.diagnostics>
<trace autoflush = "true">
<listeners>
<add name = "logListener" type = "System.Diagnostics.TextWriterTraceListener" initializeData = "cat.log" />
<add name = "consoleListener" type = "System.Diagnostics.ConsoleTraceListener"/>
</listeners>
</trace>
</system.diagnostics>
</configuration>
Я также включил TextWriter на тот случай, если вам интересно войти в файл.
Это отлично работает для .exe с конфигурацией, но у меня аналогичная ситуация, но с DLL. Я не хочу изменять файл .config вызывающего exe (это nunit-console.exe). Я продолжу поиски, но все равно проголосую за вас, поскольку я определенно кое-что узнал.
Отличное решение, но у меня есть ситуация, когда у меня разные DLL запускаются одним и тем же вызывающим exe, поэтому я не хочу изменять файл .config вызывающего exe. Я хочу, чтобы каждая DLL обрабатывала собственное изменение вывода трассировки.
Достаточно просто:
Stream outResultsFile = File.Create ("output.txt");
var textListener = new TextWriterTraceListener (outResultsFile);
Trace.Listeners.Add (textListener);
Это, конечно же, выведет вывод трассировки в файл "output.txt".
Я знаю, что это старый пост. Но у меня с этим проблема. Не могли бы вы посмотреть мой пост: stackoverflow.com/questions/5568630/…. Я делаю то же самое, но с Debug, и не получаю результатов, т.е. выходной файл пуст. Есть идеи?
Джоэл,
Вы можете сделать это вместо метода конфигурации приложения:
Trace.Listeners.Add(new ConsoleTraceListener());
или это, если вы хотите управлять добавлением или удалением слушателя во время жизни приложения:
ConsoleTraceListener listener = new ConsoleTraceListener();
Trace.Listeners.Add(listener);
Trace.WriteLine("Howdy");
Trace.Listeners.Remove(listener);
Trace.Close();
Проголосуйте за то, что указали мне на System.Diagnostics.ConsoleTraceListner. Я как-то это упустил. В остальном у меня нет app.config, но вместо этого я могу достаточно легко настроить его в коде.