IronRuby初探——在C#中调用Ruby代码

首先引入相关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;
        }

    }

然后,我们就可以通过,下面的代码执行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);
        
    }

比如test.rb:

puts  " test "

这个是最简答的RUBY代码了,我们也可以结合.NET CLR,比如:

require  ' mscorlib '

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

}

 

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

上面实现了动态建立了一段代码并且从C#给RUBY代码赋值,并显示的过程。

不只是可以输出结果,我们也可以动态地监视他们:

object val = module.LookupVariable("test");

我们也可以直接来执行表达式:

object  x  =  RubyEngine.CurrentEngine.Evaluate( " 1 + 1 " );

或者以一种IRB的交互方式:

object  x  =  RubyEngine.CurrentEngine.ExecuteInteractiveCode("1+1");

好了,就简单地介绍到这里,更多更复杂的应用还要等待我们的正式版的推出。

你可能感兴趣的:(IronRuby初探——在C#中调用Ruby代码)