【发布时间】:2012-02-17 18:49:11
【问题描述】:
我有一个 C# 项目,其中嵌入了 IronRuby 程序。该项目(包括我的 ruby 脚本)在 Visual Studio 2010 中编译为 .exe 文件以进行分发。我正在使用与此类似的模式来引导 IronRuby 脚本:http://pastebin.com/NKes1cyc(Jimmy Schementi 在此处详细介绍:http://blog.jimmy.schementi.com/2009/12/ironruby-rubyconf-2009-part-35.html)。
我的问题:我想在我的 C# 程序集中嵌入一个 gem (json_pure) 并从 ruby 脚本中调用它。
我找到的一些资源:
在 JRuby 中,您可以轻松地将 gem 打包到 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 标准库的同时将 Ruby 编译为 .exe(我认为它会动态创建和编译 C# 项目)。但看起来它只嵌入了预构建的 IronRuby .dll,而不是 ruby .rb 文件。如果我能弄清楚如何将 Ruby 源文件编译成 .dll,那么这个工具使用的方法就可以了。
如何将 IronRuby gem 嵌入到 C# 程序集中(或将 IronRuby gem 编译为 .dll)?
编辑:
IronRuby In Action 的第 472 页(“使用外部库”)解释了如何在嵌入式 ruby 文件中要求标准 ruby 库。它涉及将文件夹添加到运行时搜索路径集合,如下所示(为简洁明了而编辑):
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,但我想将 ruby 文件(来自 gem)嵌入到程序集中,以便在没有预先安装 IronRuby 的情况下运行它。
编辑 2(进一步研究):
阅读上面提到的 irpack 工具的源代码,我注意到 Kumaryu 是通过 System.IO.Packaging.Package 类将资源嵌入到最终程序集中,然后将包传递给 msbuild 的调用(参见@ 987654325@)。也许对将文件打包成可执行文件的进一步研究会导致解决方案。我看到的问题是 gem require 其他 ruby 文件中的 ruby 文件...可以在程序集包中的 ruby 文件require 同一包中的其他 ruby 文件吗?
编辑 3:
我还没有得到任何进一步的答案,但我很想听听任何人的反馈,即使它只是一个链接或关于在哪里查看的建议。我是 msbuild 的新手,文档非常丰富。对“msbuild embed zip package”的初始网络搜索未发现任何相关内容。
【问题讨论】:
-
见blog.nicksieger.com/articles/2009/01/10/… - 我需要一些帮助来构建这样易于使用的打包宝石的东西。
标签: c# .net msbuild .net-assembly ironruby