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;
}

老答案:

基本上,您可以通过访问 main 方法中的“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

我认为,这些方法取决于您希望如何初始化进程之间的通信。我相信,命名管道——是最好的选择。但如你所愿...

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 回答
0

有一次,我想登录控制台,但应用程序不是控制台应用程序。我找到的解决方案是为调用进程分配一个新的控制台

[DllImport("kernel32.dll")]
private static extern bool AllocConsole();

稍后在 App.xaml.cs 中,我分配了控制台

if (arguments.HookConsole)
{
    //Hook the console to the application to have logging features
    AllocConsole();
}

不幸的是,当主应用程序停止时,控制台也停止了......

于 2018-02-12T13:01:37.383 回答