在C# .NET中调用Ruby或Python API
我有很多用Ruby和Python开发的API和类,现在想在我的.NET应用程序中使用它们。请问我能在C#中创建Ruby或Python的对象并调用它们的方法吗?
看起来像IronPython这样的库是做相反的事情。也就是说,它们允许Python使用.NET的对象,但我想要的是能够在C#中使用Ruby或Python的对象……我是不是漏掉了什么?
有没有什么想法?
4 个回答
1
IronRuby和IronPython都可以让你使用Ruby和Python的原生模块、函数和类。这两个语言在.NET中都得到了很好的支持,特别是在动态语言运行时(DLR)下,几乎可以当作一等公民来使用。
3
如果你能等到C# 4.0(现在你可以使用测试版),它将会带来一个叫“dynamic”的新关键词。通过这个关键词,你可以像文中所描述的那样调用IronRuby或IronPython的代码,具体内容可以在这里找到。
9
这是动态语言运行时(Dynamic Language Runtime,简称DLR)要做的两件事之一:大家通常认为DLR只是为了帮助语言开发者更容易地在CLI(公共语言基础设施)上实现动态语言。但其实,它也是为了应用程序开发者,让他们更方便地在自己的应用中使用动态语言。
在DLR出现之前,每种语言都有自己的一套托管API(应用程序编程接口)。现在,DLR提供了一个标准化的托管规范,这个规范对每种语言都适用。而且,随着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 = globals.MethodMissingDemo.@new();
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数组,并将内容打印到控制台上。