C#アプリケーションでの簡単なスクリプト作成にIronRubyを使用しようとしています。私は、スクリプトエンジンを介して "Script"クラスでクラスメソッド "execute"を呼び出そうとしていますが、単に動作していません。私はいくつかの方法を試してきましたが、その方法を呼び出すことはできません。C#でのIronRubyスクリプティング:クラスメソッド/関数の呼び出し
これは私のテストRubyコードです:
class Script
def execute(input, parameter)
return "test"
end
end
今ではexecute
メソッドを持っている場合、私は最初、Script
クラスが存在するかどうかを確認したい、そしてその方法は、正確に2つのパラメータを受け入れるかどうか。これは、正常に動作するようです:
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)
}
}
クラスとメソッドは、2つのパラメータ、偉大である場合にのみ続行されます。
ここでメソッドを実行する3つの可能な方法を見つけましたが、いずれも機能しません。
(1)dynamic
を使用して、Scriptクラスのインスタンスを作成し、そのメソッドを呼び出します。出典:Calling IronRuby from C# with a delegate
dynamic ruby = engine.Runtime.Globals;
dynamic script = [email protected]();
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)は、第2のライン上の同じ例外です。 (3)engine.Operations.Invoke
を使用して
:
return engine.Operations.Invoke(rubyClass, "execute", "a", "b")
別の例外: 未定義のメソッドScriptのために 'を実行':クラス私は途方に暮れてよ
。この最後の試み(3)は、私が鉄のために使用しているものと非常に似ています(正確に同じでない場合)Python、それはうまく動作します。
Rubyコードに問題はありますか?私はRubyに精通していませんが、この単純なテストクラスでは問題はありませんか?
可能な重複.com/questions/13392178/ironruby-error-microsoft-scripting-actions-calls-overloadinfo-trying-to-port-m) –