IronRuby как язык сценариев в .NET

Я хочу использовать 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

Как я:

  1. Сделать C # метод Subscribe (определенный в хост-приложении) видимым из index.rb?
  2. Вызвать позже метод обработчика из ведущего приложения?

person rubyist111    schedule 27.05.2010    source источник


Ответы (1)


Вы можете просто использовать события .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);

А потом от Руби:

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", а затем просто использовать ее, как хотите.

person Shay Friedman    schedule 27.05.2010
comment
Большое тебе спасибо. Но остается один вопрос. Как сделать доступным демонстрационный класс (а не его экземпляр) в коде Ruby таким образом, чтобы мы могли его создать? Например: d = Demo.new - person rubyist111; 27.05.2010
comment
Добавлен ответ в текст исходного ответа выше. - person Shay Friedman; 27.05.2010
comment
С последней версией IronRuby (я полагаю, 1.13) вы получаете обратно коллекцию фиксированного размера для searchPaths, которая генерирует исключение, если вы пытаетесь добавить к ней. Вместо этого вам нужно создать свою собственную коллекцию и скопировать значения. - person ashes999; 19.09.2013