【问题标题】:IronRuby scripting in C#: invoking class method/functionC# 中的 IronRuby 脚本:调用类方法/函数
【发布时间】:2017-05-16 14:14:31
【问题描述】:

我正在尝试使用 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")

另一个例外: Script:Class 的未定义方法“执行”

我很茫然。最后一次尝试 (3) 与我在 IronPython 中使用的非常相似(如果不完全相同的话),它工作得很好。

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

【问题讨论】:

标签: c# scripting ironruby


【解决方案1】:

我自己找到了答案here

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

class System::Object
  def initialize
  end
end

【讨论】:

    猜你喜欢
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多