2017-01-02 17 views
-1

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に精通していませんが、この単純なテストクラスでは問題はありませんか?

+0

可能な重複.com/questions/13392178/ironruby-error-microsoft-scripting-actions-calls-overloadinfo-trying-to-port-m) –

答えて

1

私自身が答えを見つけましたhere

私は私のRubyスクリプトの前に以下を追加するために必要な:(のhttp:// stackoverflowの:[Microsoft.Scripting.Actions.Calls.OverloadInfo(ポートMEFにしよう)IronRubyのエラー]の

class System::Object 
    def initialize 
    end 
end 
関連する問題