C#调试日志控制台应用程序

时间:2013-10-25 20:43:05

标签: c# logging command-line console command

我正在尝试创建一个用于在C#中进行调试的控制台窗口。

例如,请考虑以下情况:

我有一个表单应用程序,我想实时将事件记录到控制台窗口 触发事件时,表单应用程序应将要打印的数据发送到控制台应用程序,以便我可以看到触发事件的时间以及有关特定事件的数据。 当我在控制台应用程序中输入特定命令时,它会将命令发送到窗体应用程序并触发事件。

因为它是用于调试的,所以控制台应该是一个单独的应用程序,这样如果主应用程序死掉,控制台窗口就不会。

如果我这样做,我认为我应该可以让控制台应用程序使用Console2 / Conemu等程序。

有没有人知道实现这一目标的正确技术?

3 个答案:

答案 0 :(得分: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 argument1 argument2 argument3

或者在IDE中使用项目的属性(在解决方案资源管理器中右键单击您的项目 - &gt;属性 - &gt;调试 - &gt;命令行参数)

我希望我能正确理解你的问题,这会有所帮助; - )

答案 1 :(得分: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)从正常启动的控制台部件应用程序“附加”创建的控制台。阅读here。我们的想法是在免费的,刚刚创建的控制台中运行以下命令。

ConEmuC.exe /AUTOATTACH

3)最后,您可以尝试“默认终端”功能。描述here

答案 2 :(得分: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();
}

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