Как перенаправить ввод Ironruby в текстовое поле (WinForms & Silverlight 4) - PullRequest
0 голосов
/ 27 сентября 2010

Я создаю Консоль IronRuby в silverlight 4 и WinForms (net4). Я могу перенаправить вывод без проблем:

MyRuntime = Ruby.CreateRuntime();
msOutput = new MemoryStream();
MyRuntime.IO.SetOutput(msOutput, Encoding.UTF8);
MyEngine = MyRuntime.GetEngine("rb");
MySource = MyEngine.CreateScriptSourceFromString("a='123'\nputs a", SourceCodeKind.Statements);
MySource.Execute();
textBox2.Text = ReadFromStream(msOutput);

Теперь я также хочу перенаправить ввод, но всегда получаю 'nil' из скрипта:

MyRuntime = Ruby.CreateRuntime();
msOutput = new MemoryStream();
msInput = new MemoryStream();
MyRuntime.IO.SetOutput(msOutput, Encoding.UTF8);
MyRuntime.IO.SetInput(msInput, Encoding.UTF8);
MyEngine = MyRuntime.GetEngine("rb");
MySource = MyEngine.CreateScriptSourceFromString("a=gets\nputs a", SourceCodeKind.Statements);
byte[] byteArray = Encoding.UTF8.GetBytes("123");
msInput.Write(byteArray, 0, byteArray.Length);
MySource.Execute();
textBox2.Text = ReadFromStream(msOutput);

Я не могу найти примеры перенаправления ввода, не могли бы вы прислать пример? Спасибо.

1 Ответ

1 голос
/ 06 октября 2010

У меня нет доступного примера кода, но вместо использования MemoryStream вам нужно реализовать поток. Когда происходит чтение в потоке, вам необходимо отправить «содержимое» текстового поля в поток. Вам понадобится какой-то механизм для определения того, когда вы отправляете содержимое - например, когда пользователь нажимает возврат. Вам также, вероятно, потребуется настроить поток для блокировки чтений и, возможно, использовать AutoResetEvent для блокировки до тех пор, пока текстовое поле не сообщит о завершении ввода.

...