2009-11-05 14 views
8

Ho un sacco di API/classi che ho sviluppato in Ruby e Python che vorrei usare nelle mie app .NET. È possibile creare un'istanza di un oggetto Ruby o Python in C# e chiamare i suoi metodi?API Call Ruby o Python in C# .NET

Sembra che le librerie come IronPython facciano l'opposto di questo. Significa che permettono a Python di utilizzare oggetti .NET, ma non il reciproco di ciò che è ciò che sto cercando ... Mi manca qualcosa qui?

Qualche idea?

+0

Non si vede il contrario perché in genere non viene eseguito al contrario. Direi che la stessa situazione si verifica con Python/C e Jython/Java. – Min

+0

@Min, C e Python funzionano in entrambe le direzioni. In effetti, la mia introduzione a Python lo incorporava in un'app C. –

risposta

9

Questa è una delle due cose che deve fare il Dynamic Language Runtime: tutti pensano che il DLR sia solo per implementatori linguistici che semplificano l'implementazione di linguaggi dinamici sulla CLI. Ma è anche per gli scrittori di applicazioni, per rendere più facile l'hosting di lingue dinamiche nelle loro applicazioni.

Prima del DLR, ogni lingua aveva la propria API di hosting. Ora, il DLR ha un standardized hosting specification che funziona allo stesso modo per ogni lingua, e con il supporto per gli oggetti dinamicamente tipizzati in C# e VB.NET 4 10, diventa più facile che mai:

// MethodMissingDemo.cs 
using System; 
using IronRuby; 

class Program 
{ 
    static void Main() 
    { 
     var rubyEngine = Ruby.CreateEngine(); 
     rubyEngine.ExecuteFile("method_missing_demo.rb"); 
     dynamic globals = rubyEngine.Runtime.Globals; 

     dynamic methodMissingDemo = [email protected](); 

     Console.WriteLine(methodMissingDemo.HelloDynamicWorld()); 

     methodMissingDemo.print_all(args); 
    } 
} 

# method_missing_demo.rb 
class MethodMissingDemo 
    def print_all(args) 
    args.map {|arg| puts arg} 
    end 

    def method_missing(name, *args) 
    name.to_s.gsub(/([[:lower:]\d])([[:upper:]])/,'\1 \2') 
    end 
end 

Qui sotto potete vedere roba farsi passare in tutte le direzioni possibili. Il codice C# sta chiamando un metodo sull'oggetto Ruby che non esiste nemmeno e il codice Ruby sta iterando su un array .NET e ne sta stampando il contenuto nella console.

-1

Ho visto modi per chiamare in Ruby/Python da C#. Ma è più semplice il contrario.

+1

Se hai visto questo, come è stato fatto? In questo caso, non è più facile per me fare il contrario. – robotshapes

3

Se è possibile attendere C# 4.0 (è possibile utilizzare la versione beta in questo momento), verrà fornito con la parola chiave "dinamica" e sarà possibile chiamare il codice IronRuby o IronPython come descritto here.

1

Entrambi IronRuby e IronPython consentono di richiamare moduli, funzioni e classi nativi di Ruby e Python. Entrambi sono supportati come lingue più o meno di prima classe in .NET, in particolare con il DLR (Dynamic Language Runtime).