IronRuby как язык сценариев в .NET - PullRequest
8 голосов
/ 27 мая 2010

Я хочу использовать 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 # Подписаться (определенный в хост-приложении) видимым из index.rb?
  2. Вызов позже метод метод из хост-приложения?

1 Ответ

7 голосов
/ 27 мая 2010

Вы можете просто использовать события .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", а затем просто использовать ее по своему усмотрению.

...