3

私はCLIとGUIの両方を持つアプリケーションを作成しています。CLIとGUIアプリケーションの両方

私はそれに関するほとんどの質問との記事を読んで、非常にこの質問USEFULL見つかり:

Can one executable be both a console and GUI application?

を私の最終的なコードは次のようになります。

 if (args.Length > 0) 
     { 
      //console code    
     } 
     else 
     { 
      FreeConsole(); 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form()); 
     } 

.exeファイルを実行しているときにこれは素晴らしい作品ダブルクリック、デバッグ、または引数付きのコンソールから実行できます。

しかし、引数なしでコンソールから実行すると、意図したようにGUIが開かれますが、GUIが閉じるのを待ってコンソールが停止します。

これはGUIとコンソールの動作に特徴がありません。コンソールは通常GUIを起動し、終了するまで待つのではなく、新しいコマンドを待ちます。

これを避ける方法はありますか?

答えて

0

あなたがにリンクされ、問題の受け入れ答えは、この一節が含まれています

Junfengの第2の技術は、ILDASMを使用するものです。彼は、両方のモードで実行するときにildasmの作者が行ったプロセス を引用しています。 最終的には、以下のようになります。

プログラムはコンソールモードのバイナリとしてマークされているので、常にコンソールで を起動します。これにより、入出力リダイレクションが正常に動作するようになります。 プログラムにコンソールモードのコマンドラインパラメータがない場合、 は自身を再起動します。 FreeConsoleを に呼び出すだけでは、最初のインスタンスをコンソールプログラムとして停止するだけでは不十分です。これは、 プログラムを起動したプロセスcmd.exeが、コンソールモードプログラム を起動し、プログラムの実行を待機していることを「知っている」ためです。 FreeConsoleを呼び出すと、ildasmはコンソールの使用を停止しますが、 はコンソールを使用して親プロセスを開始しません。

私には、コンソール・サブシステムと(実際には許可されていません)GUIサブシステム間の切り替えしようとしたバイナリを持っていることの頭痛のように見えるが、それは価値があるよりも、より多くの努力です。

1つのアプローチは、別のGUIアプリケーション.exeを持つことです。パラメータを指定せずにコンソールアプリケーションを起動すると、GUIアプリケーションが起動され、コンソールアプリケーションが終了します。

コードの重複を避けるためには、おそらくアプリケーションの実際のロジックをすべて別のクラスライブラリに入れる必要があります。

0

はたぶんあなたの直接的な質問への答えではありませんが、この二重の溶液で、あなたはトラブルを求めている:)これは、いくつかのケースで動作するハックですが、他ではありません。

適切な解決策は、「エンジン」という別のクラスライブラリに機能とアプリケーションロジックを除外して、コンソールとGUIの両方のアプリケーションの呼び出しからだろう。 3つのプロジェクトをすべて1つのVisual Studioソリューションに入れます。すべての機能と大多数のコードがそのクラスライブラリになければなりません.GUIやコンソールプロジェクトは環境に依存する特定の側面のみを処理します(例:ボタンのクリックイベントはGUIアプリなど)

0

これを行うための通常の方法は、ロジックから抽象プレゼンテーションにあり、その後のいずれかであるものを持っていない、2つのEXEファイル、1 CLI、1つのGUIを持っているになります。そのルートを下っていくと、どちらのアプローチのメリットがあるかのようなひどい妥協案が残されます。 コマンドラインオプションを使用したGUIはCLIアプリケーションではありませんが、インビジブル/短命のウィンドウを持つGUIです。

0

これは正しいと思われます。アプリケーションが停止したときにのみ戻るコマンドを起動します。

あなたは新しいスレッドでそれを開始し、それが戻るのを待ちたくない場合。 (C#5.0 =>あなたのお気に入りを選んでThreadPoolThreadTaskasync/await)。

+0

が、私はそれについてthoghtと糸を使用して、偽IsBackground =とそれを宣言し、それを実行しようとしましたが、それは何も変更していない、それはまだ終了するアプリケーションを待っていました。 – sara

0

コンソールを止めずにコンソールからGUIアプリケーションを起動する必要がありますか?コマンドプロンプトから:

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

がlibgreattao使用しているGUI/CLI/CUI /ネットワークモードで動作するアプリケーションを書くためのhere

+0

GUIアプリケーションは、とにかく戻ってきます。 'start'を使う必要はありません。これは、コンソールアプリケーションにのみ必要です。 – Joey

+0

開始コマンドは、cmdプロンプトがプロセスの終了を待つのを防ぎます –

+0

私が言ったように、それはとにかくGUIアプリケーションを待つことはありません。 'notepad'やそれに類するものを試してみてください。 – Joey

0

ベストアプローチを参照してください。

sourceforge.netで検索してください。

Libgreattaoは、ビジネス・ロジックと通信メカニズムを切り離すので、あなたのプログラムの中でどこでもlibgreattao関連するコードを置くことができます。

関連する問題