0

C# でデバッグ用のコンソール ウィンドウを作成しようとしています。

たとえば、次のシナリオを考えてみましょ

う。フォーム アプリがあり、リアルタイムでイベントをコンソール ウィンドウに記録したいと考えています。
イベントがトリガーされると、フォーム アプリは印刷するデータをコンソール アプリに送信する必要があります。これにより、イベントがいつトリガーされたか、および特定のイベントに関するデータを確認できます。
コンソール アプリで特定のコマンドを入力すると、そのコマンドがフォーム アプリに送信され、イベントがトリガーされます。

デバッグ用であるため、メイン アプリが停止してもコンソール ウィンドウが停止しないように、コンソールは別のアプリにする必要があります。

これを正しく行えば、Console2/Conemu などのプログラムでコンソール アプリを動作させることができるはずです。

これを達成するための正しいテクニックを知っている人はいますか?

4

3 に答える 3

0

更新(質問を誤解したため):

プロセス クラスを使用して Forms アプリケーションからプロセスを開始し、出力ストリームをリダイレクトするだけです。

次のように実行します。

ExecuteProcess(@"ConsoleApp.exe", "some arguments here");

// and now you can access the received data from the process from the
// receivedData variable.

コード:

/// <summary>
/// Contains the received data.
/// </summary>
private string receivedData = string.Empty;

/// <summary>
/// Starts a process, passes some arguments to it and retrieves the output written.
/// </summary>
/// <param name="filename">The filename of the executable to be started.</param>
/// <param name="arguments">The arguments to be passed to the executable.</param>
private void ExecuteProcess(string filename, string arguments)
{
    Process p = new Process();

    // Define the startinfo parameters like redirecting the output.
    p.StartInfo = new ProcessStartInfo(filename, arguments);
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.UseShellExecute = false;
    p.OutputDataReceived += this.OutputDataReceived;

    // Start the process and also start reading received output.
    p.Start();
    p.BeginOutputReadLine();

    // Wait until the process exits.
    p.WaitForExit();
}

/// <summary>
/// Is called every time output data has been received.
/// </summary>
/// <param name="sender">The sender of this callback method.</param>
/// <param name="e">The DataReceivedEventArgs that contain the received data.</param>
private void OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    this.receivedData += e.Data;
}

古い答え:

基本的に、メイン メソッドの「args」パラメータにアクセスすることで、指定されたすべてのコマンド ライン引数にアクセスできます。この小さな例では、指定されたすべてのコマンド ライン引数 (スペース文字で区切られています) をコンソールに出力し、終了する前にキーが押されるのを待ちます。

例:

/// <summary>
/// Represents our program class which contains the entry point of our application.
/// </summary>
public class Program
{
    /// <summary>
    /// Represents the entry point of our application.
    /// </summary>
    /// <param name="args">Possibly spcified command line arguments.</param>
    public static void Main(string[] args)
    {
        // Print the number of arguments specified to the console.
        Console.WriteLine("There ha{0} been {1} command line argument{2} specified.",
                          (args.Length > 1 ? "ve" : "s"), 
                          args.Length,
                          (args.Length > 1 ? "s" : string.Empty));

        // Iterate trough all specified command line arguments
        // and print them to the console.
        for (int i = 0; i < args.Length; i++)
        {
            Console.WriteLine("Argument at index {0} is: {1}", i, args[i]);
        }

        // Wait for any key before exiting.
        Console.ReadKey();
    }
}

最初の WriteLine ステートメントの引数に惑わされないでください。単数形と複数形を正しく出力したかっただけです。

コマンドラインで引数を渡すことで、コマンドライン引数を指定できます。

例: Your.exe 引数 1 引数 2 引数 3

または、IDE でプロジェクトのプロパティを使用します (ソリューション エクスプローラーでプロジェクトを右クリック -> [プロパティ] -> [デバッグ] -> [コマンド ライン引数])。

あなたの質問を正しく理解したことを願っています;-)

于 2013-10-25T22:26:09.517 に答える
0

プロセス間の通信をどのように初期化するかによって、3 つの方法があると思います。名前付きパイプが最良の選択だと思います。しかし、あなたが望むように...

1)次のコマンドでコンソールを「作成」できます

ConEmuC.exe /ATTACH /ROOT "<Full path to your console\part.exe>" <Arguments console part>
or
ConEmu.exe /cmd "<Full path to your console\part.exe>" <Arguments console part>

2) 正常に起動したコンソール部アプリから作成したコンソールを「アタッチ」。ここを読んでください。アイデアは、作成したばかりの無料のコンソールで次のコマンドを実行することです。

ConEmuC.exe /AUTOATTACH

3) 最後に、「デフォルト端末」機能を試してみてください。ここで説明します。

于 2013-10-26T12:56:49.620 に答える