[解決済み] 1つの実行ファイルでコンソールアプリケーションとGUIアプリケーションの両方になることができますか?
質問
私は C# プログラムを作りたいのですが、どのフラグが渡されるかによってCLIまたはGUIアプリケーションとして実行することができます。これは可能でしょうか?
私はこれらの関連する質問を見つけましたが、それらは私の状況を正確にカバーしていません。
どのように解決するのですか?
Jdigitalの回答
へのポイント
レイモンド・チェンのブログ
で、コンソールプログラムと非コンソールプログラムの両方を持つアプリケーションを持つことができない理由を説明しています。
*
プログラムであるアプリケーションを持つことができない理由を説明しています。OS が知る必要があるのは
プログラムが実行される前に
どのサブシステムを使用するかを知る必要があります。プログラムの実行が始まってから、他のモードに戻って要求しても手遅れです。
Cadeの回答
を指す
コンソールで.Net WinFormsアプリケーションを実行することについての記事です。
. この記事では
AttachConsole
を呼び出すというテクニックを使っています。これは、プログラムを起動したコマンドプロンプトのコンソールウィンドウに書き戻すことを可能にする効果があります。しかし、その記事のコメントは、私が致命的と考える欠点を指摘しています。
子プロセスは実際にはコンソールを制御していない。
コンソールは親プロセスに代わって入力を受け付け続け、親プロセスは、コンソールを他のことに使用する前に子プロセスの実行が終了するのを待つべきであるということを認識していません。
Chen の記事では、以下の点を指摘しています。 Junfeng Zhang による、他のいくつかのテクニックを説明する記事です。 .
1つ目は devenv が使っているものです。これは、実際には2つのプログラムを持つことで動作します。ひとつは devenv.exe で、これはメインの GUI プログラムで、もうひとつは devenv.com で、これはコンソールモードのタスクを処理しますが、コンソールライクでない方法で使用される場合、そのタスクを devenv.exe に転送して終了します。このテクニックは、Win32 のルールである com ファイルより先に exe ファイルよりも優先されます。
Windows スクリプト ホストが行う、これより単純なバリエーションがあります。これは、2 つの完全に分離したバイナリを提供します。 wscript.exe と cscript.exe . 同様に、Java では java.exe をコンソールプログラム用に、そして javaw.exe で、コンソール以外のプログラムでは
Junfengの2つ目のテクニックは、なんと ildasm が使っているものです。というプロセスを引用しています。 ildasm の作者が両方のモードで動作させる際に行ったプロセスを引用しています。最終的に、それは以下のようになります。
- プログラムはコンソールモードバイナリとしてマークされているので、常にコンソールで開始されます。これにより、入力と出力のリダイレクトが通常通りに機能します。
- プログラムがコンソールモードのコマンドラインパラメータを持っていない場合、自分自身を再スタートさせます。
を単に呼び出すだけでは不十分です。
FreeConsole
を呼び出すだけでは不十分で、最初のインスタンスがコンソールプログラムでなくなってしまうのです。というのも、プログラムを開始したプロセスが
cmd.exe
は、コンソールモードのプログラムを開始したことを知っており、プログラムの実行が停止するのを待っているのです。呼び出し
FreeConsole
を呼び出すと
ildasm
はコンソールを使わなくなりますが、親プロセスの
を開始します。
を開始させることはできません。
つまり、最初のインスタンスは自分自身を再起動します (コマンドライン・パラメータを追加して、ですね)。を呼び出すと
CreateProcess
を呼び出すとき、試すべきフラグは 2 種類あります。
DETACHED_PROCESS
と
CREATE_NEW_CONSOLE
のいずれかを使用すると、2 番目のインスタンスが親コンソールにアタッチされないことを保証します。その後、最初のインスタンスは終了し、コマンドプロンプトがコマンドの処理を再開することができます。
このテクニックの副作用は、GUI インターフェイスからプログラムを起動したときに、コンソールがまだ存在することです。コンソールは画面上で一瞬点滅し、その後消えます。
Junfengの記事中の editbin を使用してプログラムのコンソールモードフラグを変更するという部分は、赤信号だと私は思います。コンパイラや開発環境には、どの種類のバイナリを作成するかを制御する設定やオプションが用意されているはずです。その後で何かを修正する必要はないはずです。
要するに、次のようなことです。 つのバイナリを持つか、コンソールウィンドウを一瞬ちらつかせるか、です。 . 一旦、どちらがより小さな悪であるかを決定すれば、あなたは実装の選択をすることができます。
*
私はこう言います。
ノン・コンソール
ではなく
GUI
というのは、そうしないと誤った二項対立になってしまうからです。プログラムがコンソールを持たないからといって、それがGUIであるとは限りません。サービスアプリケーションはその典型例です。また、プログラムがコンソールを持つこともあります
と
ウィンドウを持つことができます。
関連
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み] .NETコンソールアプリケーションでアプリケーションのパスを取得するにはどうすればよいですか?
-
[解決済み] ファイルまたはアセンブリを読み込めませんでした ... 不正なフォーマットでプログラムをロードしようとしました (System.BadImageFormatException)
-
[解決済み] コンソールアプリケーションの出力をコンソールの代わりにVisual Studioで表示させる
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である