我正在创建一个c#winforms项目,可以作为GUI运行,也可以从命令行运行。目前,我可以处理命令行输入和参数。我可以从命令行运行程序,我可以使用该程序来处理参数。但Console.Writeline()绝对没有任何作用。任何线索可能是什么原因?
答案 0 :(得分:6)
在大多数情况下,请参阅answer here。但是,我想指出FreeConsole()
API调用的存在,它允许您优雅地关闭控制台。
[DllImport("kernel32.dll")]
static extern int FreeConsole()
我要注意的一件事是:如果您从现有控制台启动并附加到AttachConsole
(如同),则可能会看到控制台输出前面出现一些奇怪的命令提示符反对AllocConsole
)。
这是一个难以解决的时间问题。如果这是一个问题,请将您的应用程序设置为控制台应用程序,就像其他人建议的那样。它会产生没有命令提示符的效果,直到应用程序关闭,但如果你打开一个winform,这可能不是你想要的。
回复您的评论:它是AttachConsole
或 AllocConsole
。我链接的示例首先尝试附加到现有控制台。如果失败(很可能是因为它不存在),它会改为创建一个新的控制台窗口。
如果您在命令行行为和GUI交互模式方面找到了两全其美的方法,请告诉我们。我没有深入搜索解决方案,但我有一些可以从中受益的小应用程序。
顺便说一句:如果您打算在命令行上使用管道(例如将输出重定向到文件),那么不幸的是,这将无法正常工作。
答案 1 :(得分:6)
您可以使用以下DllImports在Windows窗体应用程序中启用控制台:
[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();
答案 2 :(得分:4)
这是因为您编写了一个winforms应用程序 - 这意味着System.Console.Out
(即标准输出流)设置为Stream.Null
。这意味着对该流的任何调用都将无声地失败。
您可以从命令行处理输入,因为它们来自不同的流。这个故事的寓意是你可以拥有一个winforms应用程序或一个命令行应用程序,但不能同时拥有这两个应用程序。
答案 3 :(得分:2)
我在后台线程中执行此操作,该线程从动态加载的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()
答案 4 :(得分:1)
您可能需要更改应用程序类型。这可以通过GUI中的应用程序属性进行更改(如ConsultUtah的answer中所述),也可以编辑.csproj
文件:
Winform的/ WPF:
<OutputType>WinExe</OutputType>
控制台(这是您console.writeline()
工作所需的):
<OutputType>Exe</OutputType>
Dll(包括网络应用程序):
<OutputType>Library</OutputType>
答案 5 :(得分:0)
当您在项目属性的App选项卡上配置项目类型时,它与项目类型有关,您有3个选项:
但是,如果使用Win Application,您还可以处理命令行参数,因为这些参数是在Main函数上接收的。
答案 6 :(得分:0)
必须将项目设置为编译到控制台应用程序才能使控制台功能正常工作。另一方面,它将始终具有控制台窗口,即使以GUI身份运行也是如此。我不知道这方面的解决方法(但如果有的话,我很想听听它。)