如何嵌入一个红宝石宝石进入C#项目,并要求它从一个嵌入式投入度剧本吗?

StackOverflow https://stackoverflow.com/questions/9333732

我有一个C#项目中,我有一个嵌入式投入度的程序。该项目(包括我的红宝石脚本)编制。文件在Visual Studio2010年进行分配。我使用一个模式类似,这对于引导的投入度脚本: http://pastebin.com/NKes1cyc (吉米Schementi进入更详细地在这里: http://blog.jimmy.schementi.com/2009/12/ironruby-rubyconf-2009-part-35.html).

我的问题:我想嵌入一个宝石(json_pure)在我的C#议会,并呼吁它从红宝石脚本。

一些资源,我们发现:

  1. 在继续,你可以很容易地包宝石进入一个罐子文件,然后只是需要的罐子文件在运行时 http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar

  2. 该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 (或者等着我要上报告是否它的工作原理与图书馆我想嵌入)

报告回:

这个过程中,我已经是...

  1. 叉子模块的所有项目(IronRubyEmbeddedApps,IronRubyAppPackager,农奴和Vendorize)从 https://github.com/rifraf, 和增加它们的所有成VS的解决方案。我更新的所有项目。NET4,并让他们参考,而不是包括在内。net2组件

  2. 执行Vendorize把所有依赖性/宝石 D:\projects\SomeLibrary\lib_vendor_ 通过运行:

    D:\projects\SomeLibrary\lib>ruby -I..\..\Vendorize\lib -rvendorize some_lib.rb

  3. 产生一个c#项目 D:\projects\SomeLibrary\lib\_IRPackager_\some_lib.csproj 通过运行:

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

  4. 加入some_lib.csproj到我的解决方案,升级。net4和固定的参考文献

  5. 在这一点上,可以运行的项目。净的、独立的,通过运行
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(他)的空间!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top