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

Jas*_*ler 2 c# rubygems ironruby .net-4.0 visual-studio-2010

IronRuby和VS2010 noob问题:

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

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

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

require 'RubyGems'
Run Code Online (Sandbox Code Playgroud)

有错误:

 no such file to load -- rubygems
Run Code Online (Sandbox Code Playgroud)

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

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Kev*_*ffe 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();
Run Code Online (Sandbox Code Playgroud)

  • 这正是我所需要的.我使用了一个ruby脚本``require'csv'"`并且在安装了IronRuby工具之后(我之前只使用过IronRuby NuGet包),我能够将lib文件夹复制出来并将其包含在我的项目中并获取相同的结果.谢谢你的回答! (2认同)