У меня есть проект С#, в который я встроил программу IronRuby. Проект (включая мой ruby script) скомпилирован в файл .exe в Visual Studio 2010 для распространения. Я использую шаблон, подобный этому для начальной загрузки IronRuby script: http://pastebin.com/NKes1cyc (и Джимми Schementi более подробно описывает здесь: http://blog.jimmy.schementi.com/2009/12/ironruby-rubyconf-2009-part-35.html).
Моя проблема: я хотел бы встроить gem (json_pure) в свою сборку С# и вызвать его из ruby script.
Некоторые ресурсы, которые я нашел:
-
В JRuby вы можете легко упаковать драгоценный камень в файл jar, а затем просто потребовать файл jar во время выполнения - http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar
-
Инструмент irpack (http://github.com/kumaryu/irpack) способен скомпилировать Ruby в .exe(я думаю, что он динамически создает и компилирует проект С#) при встраивании стандартной библиотеки ruby. Но похоже, что это только встраивание готовых файлов IronRuby.dlls, а не ruby .rb. Подход, который использует этот инструмент, будет работать, если я смогу выяснить, как скомпилировать исходные файлы Ruby в .dll.
Как встроить жемчужину IronRuby в сборку С# (или скомпилировать жемчужину IronRuby в .dll)?
EDIT:
Страница 472 IronRuby In Action ( "Использование внешних библиотек" ) объясняет, как требовать стандартных рубиновых библиотек из встроенного рубинового файла. Это связано с добавлением папки (ов) в коллекцию путей поиска во время выполнения, следующим образом (отредактировано для краткости и ясности):
ScriptEngine engine = IronRuby.Ruby.CreateEngine();
var searchPaths = engine.GetSearchPaths().Concat(new[]
{
"C:\\Program Files (x86)\\IronRuby 1.1\\Lib\\ruby\\1.9.1",
"C:\\Program Files (x86)\\IronRuby 1.1\\Lib\\ironruby"
});
engine.SetSearchPaths(searchPaths)
Этот подход предполагает, что на хост-машине установлен IronRuby, но я хочу вставить рубиновые файлы (из жемчужины) в сборку, чтобы он мог запускаться без предварительной установки IronRuby.
EDIT 2 (дальнейшие исследования):
Чтение исходного кода инструмента irpack, упомянутого выше, я замечаю, что Kumaryu внедряет ресурсы в финальную сборку через класс System.IO.Packaging.Package, а затем передает пакет в вызов msbuild (см. https://github.com/kumaryu/irpack/blob/master/lib/irpack/packager.rb). Возможно, некоторые дальнейшие исследования по упаковыванию файлов в исполняемый файл приведут к решению. Проблема, которую я вижу, в том, что рубиновые файлы в gem require
других рубиновых файлах... может ли рубиновый файл в сборке require
других рубиновых файлов в одном пакете?
ИЗМЕНИТЬ 3:
Я еще не получил ответа на этот вопрос, но мне было бы интересно услышать любую обратную связь, даже если это просто ссылка или предложение о том, где искать. Я новичок в msbuild, и документация довольно здоров. Первоначальный веб-поиск "msbuild embed zip package" не выявил ничего значимого.