Почему при загрузке (железного) скрипта ruby ​​через программу на C # не удается выполнить инструкции «requires»?

Вопрос о IronRuby и VS2010 о новичках:

Я пытаюсь сделать пик, чтобы проверить возможность взаимодействия между проектом C # и существующим RubyGem, а не заново изобретать это конкретное колесо в .net. Я загрузил и установил IronRuby и пакет RubyGems, а также драгоценный камень, который в конечном итоге хотел бы использовать.

Запуск .rb файлов или работа в консоли iirb Ruby без проблем. Я могу загрузить и пакет RubyGems, и сам гем и использовать его, так что, по крайней мере, для этого варианта использования моя среда настроена правильно.

Однако, когда я пытаюсь сделать то же самое из консольного приложения C # (4.0), он жалуется на самую первую строку:

require 'RubyGems'

С ошибкой:

 no such file to load -- rubygems

Приложение My Console выглядит так:

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 работает нормально, но включение любого типа «требует», похоже, приводит к сбою.

Я надеюсь, что мне просто нужно передать некоторую дополнительную информацию (пути и т. Д.) В среду выполнения ruby, когда я ее создаю, и очень надеюсь, что это не какое-то ограничение, потому что это меня огорчит.


person Jason Diller    schedule 03.03.2010    source источник


Ответы (1)


Краткий ответ: Да, это будет работать так, как вы хотите.
Вам нужно использовать метод 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();

person Kevin Radcliffe    schedule 03.03.2010
comment
Потрясающий. Я надеялся, что это было что-то в этом роде. - person Jason Diller; 03.03.2010
comment
Здорово! Рад, что у вас все получилось. Если у вас есть возможность, подпишитесь на список рассылки IronRuby, там много действительно умных и полезных людей: rubyforge.org/mailman/listinfo/ironruby-core - person Kevin Radcliffe; 03.03.2010
comment
Это именно то, что мне было нужно. Я использовал сценарий ruby ​​с "require 'csv'", и после установки инструментов IronRuby (ранее я использовал только пакет NuGet IronRuby), я смог скопировать папку lib и включить ее в свой проект и получить те же результаты. Спасибо за ответ! - person David Sulpy; 15.01.2014