我正在尝试使用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,但这个简单的测试类肯定不会造成任何问题吗?