2009-08-06 14 views
6

私はGUIとして実行することも、コマンドラインから操作することもできるc#winformsプロジェクトを作成しています。現在、コマンドライン入力と引数を処理できます。私はコマンドラインからプログラムを実行することができ、私は引数を処理するためにプログラムを使用することができます。しかしConsole.Writeline()は絶対に何もしません。それがなぜなのか何か手がかり?Console.Writeline()が動作しない

+3

はこちらをご覧ください:http://stackoverflow.com/questions/807998/how-do-i-create-ac-app-that-decides-itself-whether-to-show-as- a-console-or-wind – Thorarin

+0

コマンドラインモードでプログラムを実行すると、Console.WriteLineを呼び出すと自動的に失敗するようですか? –

+0

あなたが簡単な以下試すことができます - 静的な無効メイン(文字列[] args){ foreachの(引数の文字列引数) {Console.WriteLineを (引数); } Console.ReadLine(); } それは機能しますか? – Mutant

答えて

6

ほとんどの場合、answer hereを参照してください。しかし、私はFreeConsole() APIコールの存在を指摘したいと思います。これにより、コンソールを正常に閉じることができます。

[DllImport("kernel32.dll")] 
static extern int FreeConsole() 

私が注意したいことの一つ:あなたのコンソール出力の前に現れたコマンドプロンプトのいくつかのすごみを見て、あなたが既存のコンソールから起動するとAttachConsoleとそれにアタッチしている場合(などAllocConsoleと反対)。

これは回避するのが難しいタイミングの問題です。それが問題であれば、あなたのアプリケーションを、他の提案のようなコンソールアプリケーションに設定してください。しかし、アプリケーションが終了するまで、コマンドプロンプトが表示されないという効果があります。これは、winformを開いている場合には必要でないかもしれません。あなたのコメントに対応して

:それはどちらかだAttachConsoleまたはAllocConsole。私がリンクしている例は、まず既存のコンソールにアタッチしようとします。それが失敗した場合(おそらく存在しないため)、代わりに新しいコンソールウィンドウが作成されます。

コマンドラインの動作とGUIのインタラクティブモードの両方の面で優れた方法を見つけたら、教えてください。私は解決策を深く探求していませんが、私はいくつかのマイナーアプリが有益です。

ところで、コマンドラインでパイプを使用する場合(出力をファイルにリダイレクトするなど)、残念なことにこのようには動作しません。

+0

このソリューションは素晴らしい動作します。幸いにも私はパイプは必要ありません。ありがとうございました!! – novacara

0

それはあなたのプロジェクトのプロパティのアプリケーション]タブでそれを設定すると、プロジェクトの種類に関係している、あなたは3つのオプションがあります。

  • コンソールアプリケーション
  • 勝利アプリケーション
  • クラスライブラリ

ただし、Windowsアプリケーションで作業する場合、コマンドライン引数はMain関数で受け取られるため、処理することもできます。

0

コンソール機能を動作させるには、プロジェクトをコンソールアプリケーションにコンパイルするように設定する必要があります。一方、GUIとして実行されている場合でも、常にコンソールウィンドウが表示されます。私はこれのための回避策を知らない(しかし、もしあればそれを聞くことに興味があるだろう)。

3

これは、winformsアプリを作成したためです。つまり、System.Console.Out(標準出力ストリーム)はStream.Nullに設定されています。これは、そのストリームへのすべての呼び出しが黙って失敗することを意味します。

入力ストリームは異なるストリームからのものであるため、コマンドラインから入力を処理できます。物語の道徳は、あなたはwinformsアプリ、またはコマンドラインアプリを持つことができますが、同時に両方をすることはできないということです。

+0

はい、 Windows API呼び出しをレスキューに:) – Thorarin

5

次DllImportsを使用してWindowsフォームアプリでコンソールを有効にすることができます。

[DllImport("kernel32.dll")] 
    static extern bool AttachConsole(int dwProcessId); 
    private const int ATTACH_PARENT_PROCESS = -1; 

    [DllImport("kernel32.dll", SetLastError = true)] 
    internal static extern int FreeConsole(); 

あなたはその後、使用してコンソールを有効にすることができます。

AttachConsole(ATTACH_PARENT_PROCESS); 

をそして、あなたが使用してそれを無効にすることができます。

 FreeConsole(); 
2

これは、動的にロードされた関数を実行しているバックグラウンドスレッドで行いました私はConsole.SetOut()を追加するまで、DLL(反射)

AllocConsole(); 
IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE); 

StreamWriter standardOutput = new StreamWriter(Console.OpenStandardOutput()); 
standardOutput.AutoFlush = true; 
Console.SetOut(standardOutput); 
// 
//Console writing here 
// 
FreeConsole(); 

マイコンソールが空白だった、私はあなたが()GetStdHandleを呼び出す必要がわからない

+0

ありがとう、私はしばらくの間働いていたAllocConsoleを持っていて、突然それはもうしませんでした。 Console.SetOut()を追加すると、そのトリックが実行されました! –

1

あなたはアプリケーションの種類を変更する必要があります。 (ConsultUtahからanswerで説明したように)これは、GUIでアプリケーションのプロパティを経由して、それを変更することのいずれかによって行うことができるか、.csprojファイル編集することができます。

Winフォーム/ WPF:

<OutputType>WinExe</OutputType> 

コンソールを( これは)あなたがを作業することがconsole.writeline()ために必要なものです:

<OutputType>Exe</OutputType> 

ウェブアプリケーションシートを含むDLL( NS):

<OutputType>Library</OutputType> 
関連する問題