首先引入相关DLL:Microsoft.Scripting.dll 和Ruby.dll
然后我们新建一个类:
public
class
Class1
... {
public ScriptModule test(string path)
...{
SourceUnit unit;
string name = "rubytest1";
unit = new SourceFileUnit(RubyEngine.CurrentEngine,path, name, Encoding.UTF8);
ScriptModule m = unit.CompileToModule();
m.Execute();
return m;
}
}
... {
public ScriptModule test(string path)
...{
SourceUnit unit;
string name = "rubytest1";
unit = new SourceFileUnit(RubyEngine.CurrentEngine,path, name, Encoding.UTF8);
ScriptModule m = unit.CompileToModule();
m.Execute();
return m;
}
}
然后,我们就可以通过,下面的代码执行RUBY文件的代码,并查看结果了:
protected
void
Page_Load(
object
sender, EventArgs e)
... {
StringBuilder builder = new StringBuilder();
using (StringWriter output = new StringWriter(builder))
...{
TextWriter console_out = Console.Out;
ScriptEnvironment.GetEnvironment().RedirectIO(null, output, null);
try
...{
new Class1().test(@"F:/test.rb");
}
finally
...{
ScriptEnvironment.GetEnvironment().RedirectIO(null, console_out, null);
}
}
string actualOutput = builder.ToString();
Response.Write(actualOutput);
}
... {
StringBuilder builder = new StringBuilder();
using (StringWriter output = new StringWriter(builder))
...{
TextWriter console_out = Console.Out;
ScriptEnvironment.GetEnvironment().RedirectIO(null, output, null);
try
...{
new Class1().test(@"F:/test.rb");
}
finally
...{
ScriptEnvironment.GetEnvironment().RedirectIO(null, console_out, null);
}
}
string actualOutput = builder.ToString();
Response.Write(actualOutput);
}
比如test.rb:
puts
"
test
"
这个是最简答的RUBY代码了,我们也可以结合.NET CLR,比如:
require
'
mscorlib
'
b = System::Text::StringBuilder.new
b.Append 1
b.Append ' - '
b.Append true
puts b.to_string
puts b.length
b = System::Text::StringBuilder.new
b.Append 1
b.Append ' - '
b.Append true
puts b.to_string
puts b.length
这反应了IronRuby的特色。
当然,我们也可以在代码里执行指定的代码而不是从文件:
public
void
test2()
...
{
ScriptModule module = ScriptDomainManager.CurrentManager.CreateModule("rubytest2");
module.SetVariable("test", "this is a test");
RubyEngine.CurrentEngine.Execute("puts test", module);
}
ScriptModule module = ScriptDomainManager.CurrentManager.CreateModule("rubytest2");
module.SetVariable("test", "this is a test");
RubyEngine.CurrentEngine.Execute("puts test", module);
}
protected
void
Page_Load(
object
sender, EventArgs e)
... {
StringBuilder builder = new StringBuilder();
using (StringWriter output = new StringWriter(builder))
...{
TextWriter console_out = Console.Out;
ScriptEnvironment.GetEnvironment().RedirectIO(null, output, null);
try
...{
new Class1().test2();
}
finally
...{
ScriptEnvironment.GetEnvironment().RedirectIO(null, console_out, null);
}
}
string actualOutput = builder.ToString();
Response.Write(actualOutput);
}
... {
StringBuilder builder = new StringBuilder();
using (StringWriter output = new StringWriter(builder))
...{
TextWriter console_out = Console.Out;
ScriptEnvironment.GetEnvironment().RedirectIO(null, output, null);
try
...{
new Class1().test2();
}
finally
...{
ScriptEnvironment.GetEnvironment().RedirectIO(null, console_out, null);
}
}
string actualOutput = builder.ToString();
Response.Write(actualOutput);
}
上面实现了动态建立了一段代码并且从C#给RUBY代码赋值,并显示的过程。
不只是可以输出结果,我们也可以动态地监视他们:
object val = module.LookupVariable("test");
我们也可以直接来执行表达式:
object
x
=
RubyEngine.CurrentEngine.Evaluate(
"
1 + 1
"
);
或者以一种IRB的交互方式:
object
x
=
RubyEngine.CurrentEngine.ExecuteInteractiveCode("1+1");
好了,就简单地介绍到这里,更多更复杂的应用还要等待我们的正式版的推出。