2010-05-27 12 views
8

Tôi muốn sử dụng IronRuby làm ngôn ngữ kịch bản (ví dụ: Lua) trong dự án .NET của tôi. Ví dụ, tôi muốn có thể đăng ký từ một kịch bản Ruby cho các sự kiện cụ thể, được kích hoạt trong ứng dụng máy chủ và gọi các phương thức Ruby từ nó.IronRuby như một ngôn ngữ kịch bản trong .NET

Tôi đang sử dụng mã này cho instantiating động cơ IronRuby:

Dim engine = Ruby.CreateEngine() 
Dim source = engine.CreateScriptSourceFromFile("index.rb").Compile() 
' Execute it 
source.Execute() 

Giả index.rb chứa:

subscribe("ButtonClick", handler) 
def handler 
    puts "Hello there" 
end 

Làm thế nào để:

  1. Make C# phương pháp Theo dõi (được xác định trong ứng dụng máy chủ) có thể nhìn thấy từ index.rb?
  2. Gọi sau xử lý phương thức từ ứng dụng máy chủ?

Trả lời

7

Bạn chỉ có thể sử dụng các sự kiện .NET và đăng ký chúng trong mã IronRuby của mình. Ví dụ, nếu bạn có sự kiện tiếp theo trong mã # C:

public class Demo 
{ 
    public event EventHandler SomeEvent; 
} 

Sau đó, trong IronRuby bạn có thể đăng ký để nó như sau:

d = Demo.new 
d.some_event do |sender, args| 
    puts "Hello there" 
end 

Để làm cho lớp NET của bạn có sẵn trong mã Ruby của bạn , sử dụng một ScriptScope và thêm lớp học của bạn (this) như là một biến và truy cập nó từ bên trong mã Ruby của bạn:

ScriptScope scope = runtime.CreateScope(); 
scope.SetVariable("my_class",this); 
source.Execute(scope); 

và sau đó từ Ruby:

self.my_class.some_event do |sender, args| 
    puts "Hello there" 
end 

Để có lớp Demo có sẵn trong mã Ruby để bạn có thể khởi tạo nó (Demo.new), bạn cần phải làm cho hội đồng "có thể khám phá" bởi IronRuby. Nếu lắp ráp không nằm trong GAC sau đó thêm các thư mục lắp ráp để con đường tìm kiếm IronRuby của:

var searchPaths = engine.GetSearchPaths(); 
searchPaths.Add(@"C:\My\Assembly\Path"); 
engine.SetSearchPaths(searchPaths); 

Sau đó trong mã IronRuby của bạn, bạn có thể yêu cầu lắp ráp, ví dụ: require "DemoAssembly.dll" và sau đó chỉ cần sử dụng nó tuy nhiên bạn muốn.

+1

Cảm ơn bạn rất nhiều. Nhưng vẫn còn 1 câu hỏi. Làm thế nào để làm cho lớp Demo có sẵn (không phải là trường hợp của nó) trong mã ruby ​​theo cách như vậy mà chúng ta có thể tạo ra nó? Ví dụ: d = Demo.new – rubyist111

+0

Đã thêm câu trả lời vào phần nội dung của câu trả lời gốc ở trên. –

+0

Với IronRuby mới nhất (1.13, tôi tin), bạn sẽ nhận được một bộ sưu tập có kích thước cố định cho 'searchPaths', điều này sẽ đưa ra một ngoại lệ nếu bạn cố gắng thêm vào nó. Bạn cần tạo bộ sưu tập của riêng mình và sao chép các giá trị. – ashes999