如何嵌入一个红宝石宝石进入C#项目,并要求它从一个嵌入式投入度剧本吗?
-
27-10-2019 - |
题
我有一个C#项目中,我有一个嵌入式投入度的程序。该项目(包括我的红宝石脚本)编制。文件在Visual Studio2010年进行分配。我使用一个模式类似,这对于引导的投入度脚本: http://pastebin.com/NKes1cyc (吉米Schementi进入更详细地在这里: http://blog.jimmy.schementi.com/2009/12/ironruby-rubyconf-2009-part-35.html).
我的问题:我想嵌入一个宝石(json_pure)在我的C#议会,并呼吁它从红宝石脚本。
一些资源,我们发现:
在继续,你可以很容易地包宝石进入一个罐子文件,然后只是需要的罐子文件在运行时 http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar
该irpack工具(在 http://github.com/kumaryu/irpack)是能够编制的红宝石进入。exe(我认为它动态创建和汇编一个C#项目),同时嵌入的红宝石的标准图书馆。但是它看起来像它只是嵌入前建成投入度.dll,不是红宝石。rb文件。该法这一工具的使用将工作,如果我能想出如何编制红宝石的来源文件中的一个。dll。
我怎么嵌入一个投入度宝石进入C#会(或编制一个投入度的宝石。dll)?
编辑:
472页 如何从语言特性在行动 ("使用外部库")解释如何向需要的标准的红宝石图书馆从一个嵌入的红宝石文件。它涉及添加的文件夹(s)运行时搜索收集路径,如下所示(编辑为了简短和清晰起见):
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)
这种方法假设的主机已经投入度安装,但是我想嵌入红宝石文件(从宝石)进入大会,因此它可以运行而没有投入度预先安装。
编辑2(进一步的研究):
通过阅读的源代码的irpack工具上文引用,我注意到,Kumaryu是嵌入资源入最后会通过的系统。IO.包装。包装类,然后传递的包裹到呼叫要msbuild(见 https://github.com/kumaryu/irpack/blob/master/lib/irpack/packager.rb).也许一些进一步的研究包装文件可执行将导致一个解决方案。我看的问题是,红宝石文件中的宝石 require
其他的红宝石文件...可以红宝石文件中的一个组件包 require
其他宝石的文件在同一包吗?
编辑3:
我还没有得到任何进一步的答案,但我们有兴趣听取任何人的反馈,甚至如果这只是一个链接或建议,关于哪里可以找到。我是新来的msbuild,该文件是非常沉重。初始网上搜索"msbuild嵌入zip包"没有揭示任何相关的。
解决方案
要求是一种方法像其他任何红宝石方法一样被覆盖。我认为这就是原始的红宝石宝石包装的工作方式,宝石将简单地覆盖require
。
如果您可以通过某种方式将gem打包到.exe中,则可以覆盖require
以从程序集中加载。
其他提示
我正在使用 https://stackoverflow.com/users/2086/mcintyre321 整理他的库使用我的打包代码( https://github.com/rifraf/IronRubyAppPackager#readme)。
vendorize步骤中需要一些修复,这些修复与嵌入而不是加载而不是加载RubyGems的Ruby的更高版本有关,但是正在取得进展。
他的代码需要'json',我有一个技巧可以迫使它使用Ruby实现,而不是C-linkage .so文件。这应该意味着它可以与IronRuby一起使用。将向您报告,或者随时与您联系以提供您想要的来源。
试试这个 https://github.com/rifraf/IronRubyAppPackager#readme (或者等着我要上报告是否它的工作原理与图书馆我想嵌入)
报告回:
这个过程中,我已经是...
叉子模块的所有项目(IronRubyEmbeddedApps,IronRubyAppPackager,农奴和Vendorize)从 https://github.com/rifraf, 和增加它们的所有成VS的解决方案。我更新的所有项目。NET4,并让他们参考,而不是包括在内。net2组件
执行Vendorize把所有依赖性/宝石
D:\projects\SomeLibrary\lib_vendor_
通过运行:D:\projects\SomeLibrary\lib>ruby -I..\..\Vendorize\lib -rvendorize some_lib.rb
产生一个c#项目
D:\projects\SomeLibrary\lib\_IRPackager_\some_lib.csproj
通过运行:D:\projects\SomeLibrary\lib>ruby -I..\..\IronRubyAppPackager\lib\IRPackager.rb some_lib.rb
加入some_lib.csproj到我的解决方案,升级。net4和固定的参考文献
- 在这一点上,可以运行的项目。净的、独立的,通过运行
var Ruby = new EmbeddedRuby(); Ruby.Decoder = new 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执行,我做手册vendorizing和我有博奇的事情,在几点今天。
得出结论-这一方法非常非常近的工作,将工作,如果你的图书馆,它的依赖性工作与投入度正确,你可以得到vendorize正常工作。
我放弃了和移植的库c#的老式方法。
编辑:如下面提到的,rifraf是帮助我看到更新的工具,我使用。看t(他)的空间!