我正在编写一个可以作为标准WinForms应用程序启动的应用程序,也可以从命令行以无人参与模式启动。该应用程序是使用VS 2k5标准WinForms模板构建的。
从命令行执行应用程序时,我希望它输出可以由执行该应用程序的脚本捕获的信息。当我直接从Console.WriteLine()执行此操作时,虽然可以通过管道传输到文件来捕获输出,但不会出现输出。
另一方面,我可以通过对kernel32上的AllocConsole()进行P/Invoke来强制应用程序弹出第二个控制台。不过,这不是我想要的。我希望输出出现在从中调用该应用程序的同一窗口中。
这是使我能够从命令行弹出控制台的重要代码:
<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
最佳答案
更新1:
就像迈克尔·伯尔(Michael Burr)回答中所说,Raymond Chen最近是posted a short article about this。我很高兴看到我的猜测并非完全错误。
更新0:
免责声明:此“答案”主要是猜测。我发布它的原因仅仅是因为已经有足够的时间来确定没有多少人能回答看起来像一个基本问题的答案。
我认为,如果应用程序是gui或控制台,则“决定”是在编译时而不是在运行时做出的。因此,如果将应用程序编译为gui应用程序,即使不显示gui,它仍然是gui应用程序并且没有控制台。如果您选择将其编译为控制台应用程序,那么至少在移动到gui“mode”之前,您将有一个控制台窗口闪烁。而且我不知道托管代码是否有可能。
我认为,问题是根本的,因为控制台应用程序必须“控制”正在调用的控制台应用程序。它必须在子应用程序的代码运行之前执行此操作。