我想在我的.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
我如何:
答案 0 :(得分: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
要在您的Ruby代码中使用.NET类,请使用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类以便初始化它(Demo.new),您需要使IronRuby使程序集“可被发现”。如果程序集不在GAC中,则将程序集目录添加到IronRuby的搜索路径:
var searchPaths = engine.GetSearchPaths();
searchPaths.Add(@"C:\My\Assembly\Path");
engine.SetSearchPaths(searchPaths);
然后在您的IronRuby代码中,您可以要求程序集,例如:require "DemoAssembly.dll"
,然后根据需要使用它。