2009-11-05 66 views
8

我有很多APIs /類,我已經在Ruby和Python中開發,我想在我的.NET應用程序中使用。是否有可能在C#中實例化一個Ruby或Python對象並調用它的方法?在C#.NET中調用Ruby或Python API

似乎像IronPython這樣的庫與此相反。意思是,它們允許Python使用.NET對象,但不是這個我正在尋找的對象......我在這裏錯過了什麼嗎?

任何想法?

+0

您不會看到相反的結果,因爲它通常不會反向進行。我想說的是,Python/C和Jython/Java也會出現同樣的情況。 – Min 2009-11-05 22:57:06

+0

@Min,C和Python都可以同時使用。事實上,我對Python的介紹是將它嵌入到C應用程序中。 – 2009-11-05 23:11:14

回答

9

這是Dynamic Language Runtime應該做的兩件事情之一:每個人都認爲DLR僅適用於語言實現者,以便在CLI上實現動態語言。但是,它也適用於應用程序編寫者,以便更容易地在其應用程序中託管動態語言。

在DLR之前,每種語言都有自己的託管API。現在,DLR有standardized hosting specification的作品同樣爲語言,並與在C#動態類型對象的支持4和VB.NET 10,它變得比以往更容易:

// 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 

在這裏,你看到的東西在每個可能的方向傳遞。 C#代碼正在調用Ruby對象上的方法,該方法甚至不存在,Ruby代碼正在遍歷.NET數組並將其內容打印到控制檯。

-1

我已經看到了從c#調用Ruby/Python的方法。但相反,它更容易。

+1

如果你看過這個,它是怎麼做的?在這種情況下,我反過來也不容易。 – robotshapes 2009-11-05 22:44:44

3

如果您可以等待C#4.0(您現在可以使用測試版),它將帶有「dynamic」關鍵字,您可以按照here所述調用IronRuby或IronPython代碼。

1

IronRubyIronPython都允許您調用Ruby和Python原生模塊,函數和類。兩者在.NET中都或多或少地支持一流的語言,特別是在DLR(動態語言運行時)下。