Step 1: Make a window for the REPL. Give it a box for your input and a box for your output. How you do all this is up to you, the interesting part is how to use Ruby within it.
Step 2: Initialize the scripting engine. You need a config file, I call it ironruby.config:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="microsoft.scripting" type="Microsoft.Scripting.Hosting.Configuration.Section, Microsoft.Scripting, Version=184.108.40.20600, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" /> </configSections> <microsoft.scripting> <languages> <language names="IronRuby;Ruby;rb" extensions=".rb" displayName="IronRuby 1.0" type="IronRuby.Runtime.RubyContext, IronRuby, Version=220.127.116.11, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </languages> </microsoft.scripting> </configuration>You need to make sure you have the DLLs available that IronRuby comes with. Just put them in the same folder as your app.
Now the code to load in your Ruby stuff. Initialize a few objects:
var runtime = new ScriptRuntime(ScriptRuntimeSetup.ReadConfiguration("ironruby.config")); var engine = runtime.GetEngine("Ruby"); // create a scope - you need to do this in order to preserve variables declared across executions var globalScope = engine.CreateScope(); // I'm assuming you have a textbox or something named command, just adjust // this to what you want if you have something else var result = engine.CreateScriptSourceFromString("(" + command.Text + ").inspect").ExecuteAnd, jackpot! The result variable is a string that is the result of whatever is in the command.Text variable.
This code could be a little bit more robust, so make sure to handle exceptions nicely. An exception will be thrown if say the syntax is invalid, or there are other problems.
The nice thing about this is that you can tinker with the classes within your own application. In the REPL if you put:
# replace MyApp.exe with the .exe or .dll file that your app uses require "MyApp.exe"You can then access your namespaces and classes within your own app, and fiddle with them while the app is running!