C#で入出力をリダイレクトしているのに出力を受け取れない
最近WindowsFormApplicationからWPFに移行したので、その練習がてらにコマンドラインでの操作も同時にできるScheme用テキストエディタを作っているのですが、その際にコマンドラインの内容をTextBoxに出力し、TextBoxでの入力内容をコマンドラインに入力する必要があったので、子プロセスとしてgoshを開きその入出力をリダイレクトしました。
しかし、TextBoxからの入力はgoshに送れるのですがgoshからの標準出力が受け取れません。一方で標準エラーは受け取れるのです。以下がソースコードです。
namespace Schemer
{
/// <summary>
/// Terminal.xaml の相互作用ロジック
/// </summary>
public partial class Terminal : TextBox
{
public delegate void MyEventHandler(object sender, DataReceivedEventArgs e);
public event MyEventHandler MyEvent = null;
Process Scheme = null;
readonly string Interpreter = "gosh";
int CurrentIndex = 5;
public Terminal()
{
InitializeComponent();
MyEvent = new MyEventHandler(Event_DataRecieved);
Text = "gosh> ";
Unloaded += Terminal_Unloaded;
PreviewKeyDown += Terminal_PreviewKeyDown;
}
private void Terminal_PreviewKeyDown(object sender, KeyEventArgs e)
{
if(e.Key == Key.Enter)
{
string command = Text.Substring(CurrentIndex, Text.Length - CurrentIndex);
Scheme.StandardInput.WriteLine(command);
SelectionStart = Text.Length;
}
}
private void Terminal_Unloaded(object sender, RoutedEventArgs e)
{
try
{
if (Scheme != null)
{
Scheme.Kill();
Scheme.Close();
Scheme.Dispose();
}
}
catch (InvalidOperationException exc)
{
}
}
void Event_DataRecieved(object sender, DataReceivedEventArgs e)
{
if (e.Data == null) return;
Text += e.Data.Replace("gosh> ", "") + "\r\n" + "gosh> ";
CurrentIndex = Text.Length - 1;
}
private void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
Dispatcher.BeginInvoke(MyEvent, new object[2] { sender, e });
}
private void Scheme_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
Dispatcher.BeginInvoke(MyEvent, new object[2] { sender, e });
}
public void CreateProcess()
{
if (Scheme != null) return;
Scheme = new Process();
Scheme.StartInfo.FileName = Interpreter;
Scheme.StartInfo.UseShellExecute = false;
Scheme.StartInfo.RedirectStandardOutput = true;
Scheme.StartInfo.RedirectStandardError = true;
Scheme.StartInfo.RedirectStandardInput = true;
Scheme.OutputDataReceived += Process_OutputDataReceived;
Scheme.ErrorDataReceived += Scheme_ErrorDataReceived;
Scheme.Start();
Scheme.BeginOutputReadLine();
Scheme.BeginErrorReadLine();
}
private void SendText(string text)
{
TextCompositionManager.StartComposition(new TextComposition(InputManager.Current, this, text));
}
private void SendKey(Key key)
{
PresentationSource presentationSource = PresentationSource.FromVisual(this);
InputManager.Current.ProcessInput(new KeyEventArgs(Keyboard.PrimaryDevice, presentationSource, 100, key)
{
RoutedEvent = PreviewKeyDownEvent
});
}
}
}
因みにCreateProcessはWindowクラスのContentRenderedイベントが発火した際に呼び出しています。
実行環境はWindows 10、.NET Framework4.6.2です。
よろしくお願いします。