c# - 如何将 ruby​​ gem 嵌入到 C# 项目中并从嵌入式 IronRuby 脚本中获取它?

标签 c# .net msbuild .net-assembly ironruby

我有一个 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​​ 脚本中调用它。

我找到的一些资源:

  1. 在 JRuby 中,您可以轻松地将 gem 打包到 jar 文件中,然后只需在运行时需要该 jar 文件 - http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar

  2. 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/

相关文章:

c# - 使用 SHFILEINFO 获取文件图标

c# - 将 String 转换为 Double - 结果失败

c# - CLI 和 GUI 应用程序

c# - 无法识别的配置节entityFramework

c# - 为什么这个 Parallel.ForEach 循环没有提高性能?

msbuild - CSC 错误 CS0006 : Metadata file 'SonarAnalyzer.dll' could not be found

c# - 在 C# 和 C++ 之间交换对象

c# - 为什么 ICommand 对象必须公开才能在 WPF 中正常工作?

.net - 警告 MSB8004 : Output Directory does not end with a trailing slash.

build - 是否有工具可以显示 MS Build 项目文件中的构建依赖关系图和目标序列?