Я пишу приложение, которое можно запустить либо в качестве стандартного приложения WinForms, либо в автоматическом режиме из командной строки. Приложение было построено с использованием стандартного шаблона WinForms VS 2k5.
Когда приложение выполняется из командной строки, я хочу, чтобы он выводил информацию, которая может быть захвачена приложением script, выполняющим приложение. Когда я делаю это непосредственно из Console.WriteLine(), вывод не появляется, хотя он может быть захвачен путем подключения к файлу.
С другой стороны, я могу заставить приложение выставить вторую консоль, выполнив P/Invoke на AllocConsole() из kernel32. Это не то, что я хочу. Я хочу, чтобы вывод отображался в том же окне, из которого было вызвано приложение.
Это ключевой код, который позволяет мне вывести консоль из командной строки:
<STAThread()> Public Shared Sub Main()
If My.Application.CommandLineArgs.Count = 0 Then
Dim frm As New ISECMMParamUtilForm()
frm.ShowDialog()
Else
Try
ConsoleControl.AllocConsole()
Dim exMan As New UnattendedExecutionManager(ConvertArgs())
IsInConsoleMode = True
OutputMessage("Application started.")
If Not exMan.SetSettings() Then
OutputMessage("Execution failed.")
End If
Catch ex As Exception
Console.WriteLine(ex.ToString())
Finally
ConsoleControl.FreeConsole()
End Try
End If
End Sub
Public Shared Sub OutputMessage(ByVal msg As String, Optional ByVal isError As Boolean = False)
Trace.WriteLine(msg)
If IsInConsoleMode Then
Console.WriteLine(msg)
End If
If isError Then
EventLog.WriteEntry("ISE CMM Param Util", msg, EventLogEntryType.Error)
Else
EventLog.WriteEntry("ISE CMM Param Util", msg, EventLogEntryType.Information)
End If
End Sub