我正在创建一个C# WinForms项目,可以作为GUI运行,也可以从命令行操作。目前,我可以处理命令行输入和参数。我可以从命令行运行程序,并且可以使用程序来处理参数。但是Console.Writeline()没有任何反应。有什么线索吗?
我正在创建一个C# WinForms项目,可以作为GUI运行,也可以从命令行操作。目前,我可以处理命令行输入和参数。我可以从命令行运行程序,并且可以使用程序来处理参数。但是Console.Writeline()没有任何反应。有什么线索吗?
大部分内容请参考这里的回答。不过,我想指出FreeConsole()
API调用的存在,它可以让你优雅地关闭控制台。
[DllImport("kernel32.dll")]
static extern int FreeConsole()
需要注意的一件事情是:如果您从现有控制台启动并使用AttachConsole
附加到该控制台(而不是使用AllocConsole
),则可能会看到命令提示符出现在控制台输出前面。
这是一个难以解决的时间问题。如果这是个问题,请按照其他人建议的设置应用程序为控制台应用程序。这将产生没有命令提示符出现的效果,直到应用程序关闭,但如果您正在打开窗体,则可能不是您想要的。
针对您的评论:它要么是AttachConsole
或者 AllocConsole
。我链接的示例首先尝试附加到现有控制台。如果失败(最可能是因为不存在),则创建一个新的控制台窗口。
如果您找到了同时具有命令行行为和GUI交互模式的最佳方法,请告诉我。我没有进行任何深入搜索解决方案,但我有几个小型应用程序可以受益。
顺便说一句:如果您计划在命令行上使用管道(例如将输出重定向到文件),那么很遗憾,这种方法不起作用。
您可以使用以下 DllImports 在 Windows Forms 应用程序中启用控制台:
[DllImport("kernel32.dll")]
static extern bool AttachConsole(int dwProcessId);
private const int ATTACH_PARENT_PROCESS = -1;
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern int FreeConsole();
您可以使用以下命令启用控制台:
AttachConsole(ATTACH_PARENT_PROCESS);
您可以通过以下方式禁用它:
FreeConsole();
我在后台线程中执行了一个从动态加载的DLL(反射)中运行函数的操作。
AllocConsole();
IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
StreamWriter standardOutput = new StreamWriter(Console.OpenStandardOutput());
standardOutput.AutoFlush = true;
Console.SetOut(standardOutput);
//
//Console writing here
//
FreeConsole();
在我添加了Console.SetOut()之前,我的控制台一片空白。我不确定您是否需要调用GetStdHandle()。
System.Console.Out
(即标准输出流)设置为Stream.Null
。这意味着对该流的任何调用都会悄无声息地失败。您可能需要更改应用程序类型。可以通过在GUI中的应用程序属性中更改(如ConsultUtah的answer所述),也可以通过编辑.csproj
文件来完成:
Winform/WPF:
<OutputType>WinExe</OutputType>
控制台(这是让console.writeline()
正常工作所需的内容):
<OutputType>Exe</OutputType>
<OutputType>Library</OutputType>
这与您在项目属性的App选项卡上配置的项目类型有关,您有3个选项:
如果您使用Win应用程序,则还可以处理命令行参数,因为这些参数是在Main函数中接收的。