54532


最近WindowsFormApplicationからWPFに移行したので、その練習がてらにコマンドラインでの操作も同時にできるScheme用テキストエディタを作っているのですが、その際にコマンドラインの内容をTextBoxに出力し、TextBoxでの入力内容をコマンドラインに入力する必要があったので、子プロセスとしてgoshを開きその入出力をリダイレクトしました。  
しかし、TextBoxからの入力はgoshに送れるのですがgoshからの標準出力が受け取れません。一方で標準エラーは受け取れるのです。以下がソースコードです。

[code]

    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
                });
            }
        }
    }
    
[/code]

因みにCreateProcessはWindowクラスのContentRenderedイベントが発火した際に呼び出しています。

実行環境はWindows 10、.NET Framework4.6.2です。  
よろしくお願いします。


CC BY-SA 4.0
2019-04-27T13:37:52.493
54525
2019-04-28T01:30:20.140
32650
question
c# wpf scheme
C#で入出力をリダイレクトしているのに出力を受け取れない


`gosh`はこちらの[Gauche](http://practical-scheme.net/gauche/index-j.html)でしょうか？
入力が端末でない場合バッチモードで起動されるそうです。[コマンドラインオプション`-i`](http://practical-
scheme.net/gauche/man/gauche-refj/GauchewoQi-Dong-
suru.html)を指定することで強制的にインタラクティブモードで起動できます。

[code]

    Scheme.StartInfo.FileName = Interpreter;
    Scheme.StartInfo.Arguments = "-i";
    
[/code]

でどうでしょうか？


CC BY-SA 4.0
2019-04-28T01:30:20.140
54532
2019-04-28T01:30:20.140
4236
54525
answer