Imagine (or dream) that you have some IronRuby code to execute.
require 'net/telnet'
host = Net::Telnet.new(:Host => 'localhost')
#...
#...
#...
return data
One way to execute the code and capture the result is to use Execute<T> on the ScriptEngine object.
public T Execute<T>(string fileName)
{
var script = File.ReadAllText(fileName);
var engine = IronRuby.Ruby.CreateEngine();
engine.SetSearchPaths(
SearchPaths // will contain paths like:
// @"C:\Program Files (x86)\IronRuby 1.1\Lib\ironruby" and
// @"C:\Program Files (x86)\IronRuby 1.1\Lib\ruby\1.9.1"
);
var result = engine.Execute<T>(script);
return result;
}
However, if you want syntax checks and error messages with line numbers, you'll need to take a couple additional steps. First, define a class that derives from the abstract ErrorListener class in Microsoft.Scripting.Hosting. The ErrorReported method can provide details about errors.
public class ReportingErrorListener : ErrorListener
{
private readonly TextWriter _writer;
public ReportingErrorListener(TextWriter writer)
{
_writer = writer;
}
public override void ErrorReported(
ScriptSource source, string message,
SourceSpan span, int errorCode,
Severity severity)
{
_writer.WriteLine("Error starting at line {0} column {1}",
span.Start.Line, span.Start.Column);
_writer.WriteLine(message);
}
}
Now you can create a ScriptSource from the Ruby file, and use the ScriptSource object to Compile and Execute the result.
public T Execute<T>(string fileName)
{
var engine = IronRuby.Ruby.CreateEngine();
engine.SetSearchPaths(SearchPaths);
var source = engine.CreateScriptSourceFromFile(fileName);
source.Compile(new ReportingErrorListener(Console.Out));
var result = source.Execute<T>();
return result;
}