C#中的IronRuby脚本:调用类方法/函数

时间:2017-01-02 13:02:49

标签: c# scripting ironruby

我正在尝试使用IronRuby在C#应用程序中进行一些简单的脚本编写。我试图通过脚本引擎在类“脚本”上调用类方法“执行”,但它根本不起作用。我尝试了几种方法,似乎都没有调用该方法。

这是我的测试Ruby代码:

class Script
    def execute(input, parameter)
        return "test"
    end
end

现在我首先要检查Script类是否存在,是否具有execute方法,以及该方法是否接受两个参数。这似乎工作正常:

var engine = IronRuby.Ruby.CreateEngine();
var scope = engine.CreateScope();
var src = engine.CreateScriptSourceFromString(sourceCodeString, SourceCodeKind.Statements);
var compiled = src.Compile();
compiled.Execute(scope);

object rubyClass;
if (engine.Runtime.Globals.TryGetVariable("Script", out rubyClass))
{
    RubyClass instance = engine.Runtime.Globals.GetVariable("Script");

    var method = instance.GetMethod("execute");
    var param = method.GetRubyParameterArray();

    if (param.Count == 2)
    {
        // OK, try to execute (see below)
    }
}

只有当类和方法有两个参数时才会继续,很好。

现在要执行该方法,我找到了三种可能的方法,但都没有效果!

(1)使用dynamic创建Script类的实例并调用该方法。资料来源:Calling IronRuby from C# with a delegate

dynamic ruby = engine.Runtime.Globals;
dynamic script = ruby.Script.@new();
return script.execute("a", "b");

执行第二行时,会发生以下异常: 找不到方法:'Microsoft.Scripting.Actions.Calls.OverloadInfo [] Microsoft.Scripting.Actions.Calls.ReflectionOverloadInfo.CreateArray(System.Reflection.MemberInfo [])'。

(2)使用engine.Operations.CreateInstance和动态:

object rubyClass = engine.Runtime.Globals.GetVariable("Script");
dynamic instance = engine.Operations.CreateInstance(rubyClass);
return instance.execute("a", "b");

结果与第二行的(1)相同。

(3)使用engine.Operations.Invoke

return engine.Operations.Invoke(rubyClass, "execute", "a", "b")

另一个例外: 脚本的未定义方法'execute':Class

我很茫然。最后一次尝试(3)与我正在使用的Iron Python 非常相似(如果不完全相同),它可以正常工作。

我的Ruby代码有问题吗?我不熟悉Ruby,但这个简单的测试类肯定不会造成任何问题吗?

1 个答案:

答案 0 :(得分:1)

我自己找到了答案here

我需要在Ruby脚本之前添加以下内容:

class System::Object
  def initialize
  end
end