2013-10-25 4 views
0

Я пытаюсь создать консольное окно для отладки в C#. Например, рассмотрим следующую ситуацию:

У меня есть приложение форм, и я хочу регистрировать события в окне консоли в режиме реального времени.
Когда событие запускается, приложение формы должно отправлять данные для печати в консольное приложение, чтобы я мог видеть, когда событие инициировано, и данные о конкретном событии.
Когда я ввожу определенную команду в консольное приложение, она отправляет команду в приложение форм и запускает событие.C# debug log console app

Поскольку это для отладки, консоль должна быть отдельным приложением, так что, если основное приложение умирает, консольное окно не будет.

Если я сделаю это правильно, я предполагаю, что смогу получить консольное приложение, работающее с такими программами, как Console2/Conemu.

Кто-нибудь знает правильную технику для достижения этой цели?

+0

вы можете передать вход и выход в качестве аргумента командной строки в качестве строки [] args – VladL

+0

@ VladL Я не понимаю, можете ли вы расширить пожалуйста? –

+0

Вы хотите разделить свой код? Я имею в виду, создать консоль в другом процессе, чем приложение форм? Или вам нравится «AllocConsole» в вашем приложении приложения форм? – Maximus

ответ

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) "Attach" создана консоль с нормально начал часть консольного приложения. Прочитайте here. Идея состоит в том, чтобы запустить следующую команду в свободной, только что созданной консоли.

ConEmuC.exe /AUTOATTACH 

3) Наконец, вы можете попробовать функцию «По умолчанию терминал». Описано here.

+0

Удивительно, я не знал про именованные трубы. Отличная работа с ConEmu! –

0

Update (потому что я missunderstood вопрос):

Вы можете использовать класс процесса, чтобы запустить процесс из приложения 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; 
} 

Старый Ответ:

В принципе, вы получите доступ ко всем указанным аргументов командной строки, обращаясь к «арг "в основном методе. Маленький пример печатает все указанные аргументы командной строки (они переходят с символом пробела между ними) на консоль и ждет нажатия клавиши перед выходом.

Пример:

/// <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, используя свойства проекта (справа нажмите на ваш проект в обозревателе решений -> Свойства -> Debug -> аргументы командной строки)

Я надеюсь, что я правильно понял ваш вопрос, и это помогает ;-)

+0

Я думаю, вы неправильно поняли. Я знаю, как использовать сетевые аргументы, но я хочу, чтобы это отдельное консольное приложение для отправки команд в основное приложение. Например, если у меня есть приложение Forms, я хочу, чтобы мое приложение форм могло отправлять текстовый вывод в консольное приложение, и я хочу, чтобы мое консольное приложение могло обрабатывать команды и отправлять их в мое приложение форм. –

+0

Хорошо, я думаю, что получил это сейчас. По-моему, вы можете использовать класс Process. Просто запустите консольное приложение как процесс в вашем приложении форм и подключитесь к получателю обработчика выходных событий. –

+0

Консоль должна быть независимой от приложения формы. Он должен начинаться сам по себе, а не начинать его с приложения формы. –

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

К сожалению, когда основное приложение останавливается, консольные остановки тоже ...