我有一个嵌入了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库。它涉及到将文件夹添加到运行时搜索路径集合,如下所示(为简洁和清楚起见进行了编辑):
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“没有显示任何相关的东西。
发布于 2012-02-26 10:21:31
可以像任何其他Require is a method方法一样被重写的ruby。我认为这就是原始的ruby gem包的工作方式,gem会简单地覆盖require
。
如果您能够以某种方式将gem打包到您的.exe中,则可以重写require
以从程序集加载。
发布于 2012-02-28 23:31:20
尝试这个https://github.com/rifraf/IronRubyAppPackager#readme (或者等我报告它是否适用于我正在尝试嵌入的库)
反馈:
我去过的过程是...
D:\projects\SomeLibrary\lib_vendor_
:通过运行以下命令,在D:\projects\SomeLibrary\lib\_IRPackager_\some_lib.csproj
上D:\projects\SomeLibrary\lib>ruby -I..\..\Vendorize\lib -rvendorize some_lib.rb
将some_lib.csproj D:\projects\SomeLibrary\lib>ruby -I..\..\IronRubyAppPackager\lib\IRPackager.rb some_lib.rb
在.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正在帮助我,并研究更新我正在使用的工具。注意他的空间!
发布于 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一起工作。将返回报告,或随时与我联系您想要运行的源代码。
https://stackoverflow.com/questions/9333732
复制相似问题