首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将ruby gem嵌入到C#项目中并从嵌入的IronRuby脚本中请求它?

如何将ruby gem嵌入到C#项目中并从嵌入的IronRuby脚本中请求它?
EN

Stack Overflow用户
提问于 2012-02-18 02:49:12
回答 3查看 2.6K关注 0票数 16

我有一个嵌入了IronRuby程序的C#项目。该项目(包括我的ruby脚本)在Visual Studio2010中被编译为.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脚本调用它。

我找到了一些资源:

Ruby在JRuby中,您可以很容易地将gem打包成jar文件,然后在运行时简单地需要jar文件- ruby工具(位于http://github.com/kumaryu/irpack)能够在嵌入ruby标准库的同时将编译成.exe (我认为它会动态创建和编译C#项目)。但它看起来只是嵌入了预先构建的IronRuby .dlls,而不是ruby .rb文件。如果我能弄清楚如何将Ruby源文件编译成.dll,那么这个工具使用的方法就可以工作。

如何将IronRuby gem嵌入到C#程序集中(或将IronRuby gem编译为.dll)?

编辑:

IronRuby使用中的第472页(“使用外部库”)解释了如何在嵌入式ruby文件中使用标准ruby库。它涉及到将文件夹添加到运行时搜索路径集合,如下所示(为简洁和清楚起见进行了编辑):

代码语言:javascript
复制
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的情况下运行。

EDIT 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文件?

EDIT 3:

我还没有得到进一步的答案,但我很有兴趣听到任何人的反馈,即使它只是一个链接或关于在哪里查找的建议。我是msbuild的新手,文档非常丰富。最初的网络搜索"msbuild embed zip package“没有显示任何相关的东西。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-26 10:21:31

可以像任何其他Require is a method方法一样被重写的ruby。我认为这就是原始的ruby gem包的工作方式,gem会简单地覆盖require

如果您能够以某种方式将gem打包到您的.exe中,则可以重写require以从程序集加载。

票数 3
EN

Stack Overflow用户

发布于 2012-02-28 23:31:20

尝试这个https://github.com/rifraf/IronRubyAppPackager#readme (或者等我报告它是否适用于我正在尝试嵌入的库)

反馈:

我去过的过程是...

  1. 将来自https://github.com/rifraf的所有项目(IronRubyEmbeddedApps、IronRubyAppPackager、Serfs和Vendorize)分叉和子模块,并将它们全部添加到VS解决方案中。我通过运行以下命令,将所有项目更新为.NET4,并使它们相互引用,而不是包含的.net2 assemblies
  2. executed Vendorize,以拆分所有依赖项/gem D:\projects\SomeLibrary\lib_vendor_

通过运行以下命令,在D:\projects\SomeLibrary\lib\_IRPackager_\some_lib.csprojD:\projects\SomeLibrary\lib>ruby -I..\..\Vendorize\lib -rvendorize some_lib.rb

  • Generated一个c#项目:

将some_lib.csproj D:\projects\SomeLibrary\lib>ruby -I..\..\IronRubyAppPackager\lib\IRPackager.rb some_lib.rb

  • Added到我的解决方案,将其升级到.net4并进行修复。此时,您可以通过运行

在.NET中独立运行该项目

var Ruby =新EmbeddedRuby();Ruby.Decoder =新Program.GZipDecoder();Ruby.Mount("App");Ruby.Run("gocardless.rb");

它成功了!我觉得太棒了!

实际上,在这一点上,我发现在步骤2中,Vendorize每个需要的库都失败了。Vendorize的工作方式是截取require调用,然后将被调用的rb文件保存到_Vendor_中-如果不执行require (所以运行所有测试,希望测试覆盖率为100%),它将不会被提取。

由于某种原因,它没有拾取一个所需的文件,即使有一个要求。最后,我通过复制我的库并使用bundle install --deployment命令手动创建了供应商目录的内容。重复步骤3和4,我就完成了...对吗?

不,当我运行生成的项目时,我得到了一些关于no such file to load -- json/pure的错误-我认为这是由于没有原生json实现的ironruby,我做了手动vendorizing,以及我不得不在今天的几个点上做一些事情的组合。

总而言之--这个方法非常接近于工作,如果你的库和它的依赖与ironruby一起正常工作,并且你可以让vendorize正常工作,那么它也会工作。

我放弃了,以旧的方式将库移植到c#。

编辑:正如下面提到的,rifraf正在帮助我,并研究更新我正在使用的工具。注意他的空间!

票数 3
EN

Stack Overflow用户

发布于 2012-03-01 15:39:07

我正在与https://stackoverflow.com/users/2086/mcintyre321合作,使用我的打包代码( https://github.com/rifraf/IronRubyAppPackager#readme )将他的库包装成C#/IronRuby。

在vendorize步骤中需要一些修复,这些修复与嵌入而不是加载RubyGems的Ruby的后续版本相关,但正在取得进展。

他的代码需要'json',我有一个技巧可以强制它使用Ruby实现而不是C链接的.so文件。这应该意味着它将与IronRuby ok一起工作。将返回报告,或随时与我联系您想要运行的源代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9333732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档