Я хочу использовать IronRuby в качестве языка сценариев (как Lua, например) в моем проекте.NET. Например, я хочу смочь подписаться от сценария 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
Как делают меня:
Вы можете просто использовать события .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
Чтобы класс Demo был доступен в коде Ruby, и вы могли его инициализировать (Demo.new), вам нужно сделать сборку "обнаруживаемой" IronRuby. Если сборка не находится в GAC, добавьте каталог сборки в пути поиска IronRuby:
var searchPaths = engine.GetSearchPaths();
searchPaths.Add(@"C:\My\Assembly\Path");
engine.SetSearchPaths(searchPaths);
Затем в вашем коде IronRuby вы можете потребовать сборку, например: require "DemoAssembly.dll"
и затем просто использовать ее, как вам захочется.