当通过C#程序加载(铁)ruby脚本时,为什么'require'语句会失败?

时间:2010-03-03 00:10:45

标签: c# visual-studio-2010 rubygems .net-4.0 ironruby

IronRuby和VS2010 noob问题:

我正在努力测试C#项目和现有RubyGem之间互操作的可行性,而不是重新发明.net中的特定轮子。我已经下载并安装了IronRuby和RubyGems包,以及我最终想要使用的gem。

运行.rb文件或在iirb Ruby控制台中工作没有问题。我可以加载RubyGems包和gem本身并使用它,所以,至少对于那个用例,我的环境设置正确。

但是,当我尝试在C#(4.0)控制台应用程序中执行相同类型的操作时,它会抱怨第一行:

require 'RubyGems'

错误:

 no such file to load -- rubygems

我的控制台应用程序如下所示:

using System;
using IronRuby;
namespace RubyInteropSpike
{
    class Program
    {
        static void Main(string[] args)
        {
            var runtime = Ruby.CreateRuntime();

            var scope = runtime.ExecuteFile("test.rb");
            Console.ReadKey();
        }
    }
}

删除依赖项并只是做一些基本的自包含Ruby工作正常,但包括任何类型的'requires'语句似乎导致它失败。

我希望我在创建它时只需要将一些额外的信息(路径等)传递给ruby运行时,并且真的希望这不是某种限制,因为这会让我感到难过。

1 个答案:

答案 0 :(得分:6)

简短回答:是的,这将按照你想要的方式工作。
你需要使用引擎的SetSearchPaths方法来做你想做的事。

更完整的例子
(假设您将IronRuby加载到C:\ IronRubyRC2作为根安装目录)

    var engine = IronRuby.Ruby.CreateEngine();

    engine.SetSearchPaths(new[] {
        @"C:\IronRubyRC2\Lib\ironruby",
        @"C:\IronRubyRC2\Lib\ruby\1.8",
        @"C:\IronRubyRC2\Lib\ruby\site_ruby\1.8"
    });

    engine.Execute("require 'rubygems'"); // without SetSearchPaths, you get a LoadError
    /*
    engine.Execute("require 'restclient'"); // install through igem, then check with igem list
    engine.Execute("puts RestClient.get('http://localhost/').body");
    */
    Console.ReadKey();