【发布时间】: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 不是很熟悉,但是这个简单的测试类肯定不会造成任何问题吗?
【问题讨论】: