我有一个 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 的调用中(参见 https://github.com/kumaryu/irpack/blob/master/lib/irpack/packager.rb ).也许进一步研究将文件打包成可执行文件会找到解决方案。我看到的问题是 gem 中的 ruby 文件 require
其他 ruby 文件...程序集包中的 ruby 文件可以 require
同一包中的其他 ruby 文件吗?
编辑 3:
我还没有得到任何进一步的答案,但我很想听听任何人的反馈,即使它只是一个链接或关于在哪里查看的建议。我是 msbuild 的新手,文档非常丰富。对“msbuild embed zip package”的初始网络搜索没有显示任何相关信息。
最佳答案
Require is a method可以像任何其他 ruby 方法一样被覆盖。我认为这就是原始 ruby gems 包的工作方式,gems 将简单地覆盖 require
。
如果你能以某种方式将 gem 打包到你的 .exe 中,你可以覆盖 require
以从程序集加载。
关于c# - 如何将 ruby gem 嵌入到 C# 项目中并从嵌入式 IronRuby 脚本中获取它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9333732/