Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CLI和GUI应用程序_C#_User Interface_Console Application_Command Line Interface - Fatal编程技术网

C# CLI和GUI应用程序

C# CLI和GUI应用程序,c#,user-interface,console-application,command-line-interface,C#,User Interface,Console Application,Command Line Interface,我正在编写一个同时具有CLI和GUI的应用程序 我阅读了大多数关于它的问题和文章,发现这个问题非常有用: 我的最终代码如下所示: if (args.Length > 0) { //console code } else { FreeConsole(); Application.EnableVisualStyles(

我正在编写一个同时具有CLI和GUI的应用程序

我阅读了大多数关于它的问题和文章,发现这个问题非常有用:

我的最终代码如下所示:

        if (args.Length > 0)
        {
            //console code            
        }
        else
        {
            FreeConsole();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form());
        } 
这在双击运行.exe、调试或从带有参数的控制台运行时非常有效

但是,当从控制台运行它时,没有参数,GUI是打开的,就像我预期的那样,但是控制台被卡住了,等待GUI关闭

这是不寻常的GUI和控制台行为。控制台通常启动GUI,而不是等待退出,而是等待新命令


有办法避免吗

您链接到的问题的公认答案包含以下内容:

俊峰的第二种技术是ildasm使用的。他引用了这个过程 ildasm的作者在两种模式下运行时都经历了这一过程。 最后,以下是it的作用:

程序被标记为控制台模式二进制文件,因此它总是启动 我拿着控制台出去了。这允许输入和输出重定向工作 像平常一样。如果程序没有控制台模式命令行参数, 它重新启动自己。仅仅调用FreeConsole是不够的 使第一个实例不再是控制台程序。那是因为 启动程序cmd.exe的进程“知道”它已启动 控制台模式程序,正在等待程序停止运行。 调用FreeConsole会使ildasm停止使用控制台,但 无法使父进程开始使用控制台

对我来说,让二进制文件在控制台子系统和GUI子系统之间切换(这是不允许的)似乎是一件令人头痛的事,这是不值得的

一种方法是使用单独的GUI应用程序.exe。只要控制台应用程序在没有参数的情况下启动,它就会启动GUI应用程序并自行关闭


为了防止代码重复,这可能需要将应用程序的所有实际逻辑放在一个单独的类库中。

也许不能回答您的直接问题,但使用这种双重解决方案,您会自找麻烦:)这是一种在某些情况下可行的黑客行为,但在其他情况下则不行


正确的解决方案是在单独的类库中排除功能和应用程序逻辑,然后从控制台和GUI应用程序调用“引擎”。将所有这三个项目放在一个VisualStudio解决方案中。所有功能和绝大多数代码都应该在该类库中,GUI和控制台项目只处理取决于环境的特定方面(例如,按钮单击事件只在GUI应用程序中出现等)。

通常的方法是从逻辑中抽象表示,然后有两个EXE,一个CLI,一个GUI,没有一个可能是这样的。沿着这条路走下去会让你陷入某种可怕的妥协,这两种方法都没有好处。
带有命令行选项的GUI不是CLI应用程序,它是一个带有不可见/短期窗口的GUI。

这看起来是正确的。您启动的命令仅在应用程序停止时返回


如果不想等待它返回,请在新线程中启动它。(
ThreadPool
Thread
Task
async
/
wait
在C#5.0=>中选择您最喜欢的。)

需要从控制台启动gui应用程序而不卡住控制台吗?从命令提示符键入:

start "[title not necessary for gui exe]" "full path to .exe"

请参见

在GUI/CLI/CUI/网络模式下编写应用程序的最佳方法是使用libgreattao

在sourceforge.net上搜索它


Libgreattao将业务逻辑和通信机制解耦,因此您可以将Libgreattao相关代码放在程序中的任何地方。

我考虑过并尝试过这样做,使用一个线程并用IsBackground=false声明它,但它没有改变任何东西,它仍在等待应用程序退出。GUI应用程序仍会立即返回。无需使用
start
。这仅对控制台应用程序是必需的。start命令阻止cmd提示符等待进程结束,正如我所说的,它无论如何不会等待GUI应用程序。试试记事本或类似的东西。