开始一个C# Windows应用程序并在命令行等待退出

6
通常情况下,在命令提示符中调用Windows应用程序不会等待其退出。一旦我键入myFormApp.exe并按下回车键,一个表单将显示出来,命令提示符立即移到下一行。
C:\> myFormApp.exe
C:\>     # this line will display immediately

我知道使用cmd /c将等待应用程序退出。
C:\> cmd /c myFormApp.exe
C:\>     # this line will display after myFormApp.exe closed

即使没有 cmd /c,我仍希望等待。

是否有任何方法可以防止命令提示符转到新行,而不编辑 myFormApp.exe 源代码?

AllocConsole 添加到 Windows 应用程序将显示控制台,但它不会使命令提示符等待退出。

if (args.Length > 0)
{
    // Command line given, display console
    AllocConsole();
}
else
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

任何建议都将不胜感激。谢谢!
2个回答

3

不需要编写额外的应用程序。Windows中已经有这样的一个选项:start/wait。它不仅会等待您的应用程序执行完毕,还会设置返回的错误级别(也称为ExitCode)。


2

您可以编写一个简单的控制台应用程序来包装您的 WinForms 应用程序。您可以在控制台应用程序内部启动进程:

static void Main(string[] args)
{
    Console.WriteLine("Hello!");

    var process = new Process() { StartInfo = new ProcessStartInfo { FileName = @"WindowsFormsApplication1.exe" } };
    process.Start();
    process.WaitForExit();

    Console.WriteLine("bye bye!");
}

或者您可以在控制台应用程序中添加对winforms应用程序的引用,并实例化winforms类:

static void Main(string[] args)
{
    Console.WriteLine("Hello!");

    var mainForm = new WindowsFormsApplication1.Form1();
    mainForm.ShowDialog();

    Console.WriteLine("bye bye!");
}

1
当通过双击执行包装控制台应用程序时,会显示命令提示符。这不是期望的行为。有没有办法避免它? - user2429888
不,其实不是这样的。你可以将包装应用程序的输出类型更改为Windows应用程序,这将使窗口不出现,但如果你从控制台启动它,它将不会等待执行完成。我不太确定你想要实现什么,可能是为了解决错误的问题。阻止提示移动到新行并不能解决任何问题。用户总是可以打开一个新提示并进行任何操作。 - Bartosz
你可以使用Interop来隐藏和显示控制台窗口。在启动时隐藏它,在退出时显示。这样,如果你在Windows中双击你的应用程序,就不会显示控制台,如果你从现有的控制台启动它,它将在WinForms应用程序执行期间隐藏,但当你退出时又会显示出来。https://dev59.com/53A65IYBdhLWcg3w5zDB不过我不建议这样做。 - Bartosz
我想做的是等待从命令行调用的 Windows 应用程序执行,当双击 exe 时,应用程序将不显示控制台。 - user2429888
6
无法建立一个应用程序,既可以在命令提示符中启动时使其等待,又可以在从资源管理器中启动时不创建新的控制台窗口。这两者是互斥的,因为它们都基于完全相同的东西:可执行文件是否标记为控制台应用程序或GUI应用程序。唯一的解决方案是拥有两个不同的可执行文件,虽然实际的代码可以通过DLL共享或一个可执行文件可以启动另一个来实现。 - Harry Johnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接