8

.NETプロジェクトでスクリプト言語として(たとえば、Luaなど) IronRubyを使用したいと思います。たとえば、Rubyスクリプトから特定のイベントにサブスクライブし、ホストアプリケーションで起動して、そこからRubyメソッドを呼び出せるようにしたいです。

IronRubyエンジンをインスタンス化するためにこのコードを使用しています:

Dim engine = Ruby.CreateEngine()
Dim source = engine.CreateScriptSourceFromFile("index.rb").Compile()
' Execute it
source.Execute()

index.rbに次のものが含まれているとします。

subscribe("ButtonClick", handler)
def handler
   puts "Hello there"
end

どうすればよいですか:

  1. C#メソッドSubscribe(ホストアプリケーションで定義)をindex.rbから表示しますか?
  2. ホストアプリケーションから後でハンドラーメソッドを呼び出しますか?
4

1 に答える 1

7

.NETイベントを使用して、IronRubyコード内でそれらをサブスクライブできます。たとえば、C#コードに次のイベントがある場合:

public class Demo
{
    public event EventHandler SomeEvent;
}

次に、IronRubyで次のようにサブスクライブできます。

d = Demo.new
d.some_event do |sender, args|
    puts "Hello there"
end

.NETクラスをRubyコード内で使用できるようにするには、を使用しScriptScopeてクラス()を変数として追加thisし、Rubyコード内からアクセスします。

ScriptScope scope = runtime.CreateScope();
scope.SetVariable("my_class",this);
source.Execute(scope);

そしてRubyから:

self.my_class.some_event do |sender, args|
    puts "Hello there"
end

デモクラスをRubyコード内で使用できるようにして、初期化できるようにするには(Demo.new)、IronRubyでアセンブリを「検出可能」にする必要があります。アセンブリがGACにない場合は、アセンブリディレクトリをIronRubyの検索パスに追加します。

var searchPaths = engine.GetSearchPaths();
searchPaths.Add(@"C:\My\Assembly\Path");
engine.SetSearchPaths(searchPaths);

次に、IronRubyコードで、たとえばアセンブリを要求できます。次に、必要にrequire "DemoAssembly.dll"応じてそれを使用します。

于 2010-05-27T15:02:42.290 に答える