8

我想在我的 .NET 项目中使用 IronRuby 作为脚本语言(例如Lua)。例如,我希望能够从 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# 方法订阅(在主机应用程序中定义)从 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 代码中可用,请使用 aScriptScope并将您的类 ( 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 类以便初始化它 (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 回答