gpt4 book ai didi

c# - 一个可执行文件既可以是控制台又可以是GUI应用程序吗?

转载 作者:可可西里 更新时间:2023-11-01 09:38:37 25 4
gpt4 key购买 nike

我想制作一个可以作为CLI或GUI应用程序运行的C#程序,具体取决于传递给它的标志。能做到吗?

我发现了以下相关问题,但它们并不能完全满足我的情况:

  • How to write to the console in a GUI application
  • How do I get console output in C++ with a Windows program?
  • 最佳答案

    Jdigital's answer指向Raymond Chen's blog,这解释了为什么不能同时拥有控制台程序和非控制台*程序的应用程序:操作系统需要在程序开始运行要使用的子系统之前知道。程序开始运行后,现在返回并请求其他模式为时已晚。
    Cade's answer指向an article about running a .Net WinForms application with a console。程序开始运行后,它将使用调用 AttachConsole 的技术。这样的效果是允许程序将其写回到启动程序的命令提示符的控制台窗口中。但是该文章中的评论指出了我认为是致命的缺陷:子进程实际上并不能控制控制台。控制台继续代表父进程接受输入,并且父进程不知道在使用控制台进行其他操作之前,它应等待子进程完成运行。
    Chen的文章指向an article by Junfeng Zhang that explains a couple of other techniques
    首先是devenv的用途。它实际上有两个程序。一个是devenv.exe,它是主GUI程序,另一个是devenv.com,它处理控制台模式任务,但是如果以非控制台方式使用它,则它将其任务转发给devenv.exe和退出。该技术依赖于Win32规则,当您键入不带文件扩展名的命令时,将在exe文件之前选择com文件。
    Windows脚本宿主在此方面有一个更简单的变体。它提供了两个完全独立的二进制文件wscript.exe和cscript.exe。同样,Java为控制台程序提供java.exe,为非控制台程序提供javaw.exe。
    俊峰的第二种技术是ildasm使用的技术。他引用了ildasm的作者在两种模式下运行时所经历的过程。最终,这是它的作用:

  • 该程序被标记为控制台模式二进制文件,因此它始终从控制台开始。这样可以使输入和输出重定向正常进行。
  • 如果程序没有控制台模式的命令行参数,它将重新启动自身。

  • 仅仅调用 FreeConsole来使第一个实例不再是控制台程序是不够的。这是因为启动程序cmd.exe的进程“知道”它已启动控制台模式程序,并且正在等待程序停止运行。调用 FreeConsole将使ildasm停止使用控制台,但不会使父进程开始使用控制台。
    因此,第一个实例会自行重启(我想带有一个额外的命令行参数)。当您调用 CreateProcess时,可以尝试使用两种不同的标志 DETACHED_PROCESS and CREATE_NEW_CONSOLE ,这两种标志都将确保第二个实例不会附加到父控制台。之后,第一个实例可以终止并允许命令提示符恢复处理命令。
    这种技术的副作用是,当您从GUI界面启动程序时,仍然会有一个控制台。它将在屏幕上短暂闪烁,然后消失。
    我认为,Junfeng文章中有关使用editbin更改程序的控制台模式标志的部分是一个红色的鲱鱼。您的编译器或开发环境应提供一个设置或选项来控制它创建哪种二进制文件。此后无需再进行任何修改。
    然后,最重要的是 ,您可以具有两个二进制文件,也可以瞬间闪烁控制台窗口。一旦确定哪个是较小的邪恶,就可以选择实现。 *我说的是非控制台而不是GUI,因为否则它是错误的二分法。仅仅因为程序没有控制台并不意味着它具有GUI。服务应用程序就是一个很好的例子。另外,程序可以具有控制台和窗口。

    关于c# - 一个可执行文件既可以是控制台又可以是GUI应用程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10284481/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com