2010-09-27 38 views
0

Je construis une console IronRuby dans silverlight 4 et WinForms (net4). Je peux rediriger la sortie sans problème:Comment rediriger l'entrée de ironruby vers une zone de texte (WinForms & Silverlight 4)

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

Maintenant, je veux rediriger l'entrée aussi, mais toujours obtenir un « néant » à partir du script:

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

Je ne peux pas trouver des échantillons de redirection l'entrée, pouvez-vous s'il vous plaît envoyer un exemple? Je vous remercie.

Répondre

1

Je n'ai aucun exemple de code immédiatement disponible mais au lieu d'utiliser un MemoryStream, vous devez implémenter le flux. Lorsque des lectures sur le flux se produisent, vous devez envoyer le "contenu" de la zone de texte au flux. Vous aurez besoin d'un mécanisme pour déterminer quand vous envoyez le contenu - par ex. lorsque l'utilisateur frappe retour. Vous devrez également probablement configurer un thread pour le blocage des lectures et probablement utiliser un AutoResetEvent pour bloquer jusqu'à ce que la zone de texte signale que l'entrée est terminée.