Domanda

Ho un progetto C# in cui ho incorporato un IronRuby programma.Il progetto (tra cui il mio script ruby) è compilato un .exe file in Visual Studio 2010 per la distribuzione.Sto utilizzando un modello simile a questo per fare il bootstrap del IronRuby script: http://pastebin.com/NKes1cyc (e Jimmy Schementi va più nel dettaglio qui: http://blog.jimmy.schementi.com/2009/12/ironruby-rubyconf-2009-part-35.html).

Il mio problema:Vorrei incorporare un gioiello (json_pure) nel mio C# assemblea e chiamata da uno script ruby.

Alcune risorse che ho trovato:

  1. In JRuby, si può facilmente pacchetto di una gemma in un file jar e quindi richiedono semplicemente il file jar in fase di runtime - http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar

  2. Il irpack strumento (a http://github.com/kumaryu/irpack) è in grado di compilare Ruby in un' .exe (penso che si crea dinamicamente e compila un progetto C#) mentre l'incorporamento ruby libreria standard.Ma sembra che sia solo l'incorporamento di pre-costruito IronRuby .dll, non ruby .rb file.L'approccio a questo strumento utilizza avrebbe funzionato se riuscissi a capire come compilare Ruby file di origine in un' .dll.

Come faccio a incorporare un IronRuby gemma in un assembly C# (o la compilazione di un IronRuby gioiello per una .dll)?

EDIT:

Pagina 472 di IronRuby In Azione ("L'uso di Librerie Esterne") spiega come richiedere standard di ruby raccolte all'interno di un embedded ruby file.Consiste nell'aggiungere la cartella(s) per il runtime percorsi di ricerca per la raccolta, come segue (a cura di, per brevità e chiarezza):

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)

Questo approccio presuppone che la macchina host ha IronRuby installato, ma voglio incorporare i file ruby (da una gemma) in assemblea modo che possa essere eseguito senza IronRuby pre-installato.

EDIT 2 (ulteriori ricerche):

Leggendo il codice sorgente del irpack strumento di riferimento di cui sopra, ho notato che Kumaryu è l'incorporazione di risorse per l'assemblaggio finale, attraverso il Sistema.IO.L'imballaggio.Pacchetto di classe, e poi passando il pacchetto nella chiamata a msbuild (vedere https://github.com/kumaryu/irpack/blob/master/lib/irpack/packager.rb).Forse qualche ulteriore ricerca di imballaggio file in un file eseguibile porterebbe ad una soluzione.Il problema che io vedo è che i file ruby in un gioiello require altri file ruby...può un rubino file di assieme in un pacchetto require altri file ruby nello stesso pacchetto?

EDIT 3:

Non ho ottenuto alcuna ulteriore di una risposta, ma sarei curioso di sentire da chiunque feedback, anche se è solo un link o un suggerimento su dove cercare.Sono nuovo di msbuild, e la documentazione è abbastanza pesante.Una prima ricerca sul web per "msbuild incorporare pacchetto zip" non rivelano nulla di rilevante.

È stato utile?

Soluzione

Bisogno è un metodo che può essere ignorata, come qualsiasi altro metodo ruby.Penso che è come l'originale rubino gemme pacchetto lavorato, gemme semplicemente ignorare require.

Se è possibile comprimere la gemma nel tuo .exe in qualche modo, è possibile eseguire l'override require a carico dall'assemblea.

Altri suggerimenti

Sto lavorando con https://stackoverflow.com/users/2086/mcintyre321 per ottenere la sua biblioteca avvolto in C#/IronRuby usando il mio imballaggio codice ( https://github.com/rifraf/IronRubyAppPackager#readme ).

Ci sono alcune correzioni necessarie nel vendorize passo che sono legati per le successive versioni di Ruby avere RubyGems embedded e non caricata, ma il progresso è stato fatto.

Il suo codice di necessita 'json', e ho un trucco per forzare l'utilizzo di Ruby attuazione, piuttosto che il C-linkage .così i file.Questo dovrebbe significare che funzionerà con IronRuby ok.Riporterà indietro, o non esitate a contattarmi con la sorgente che si desidera eseguire.

prova questo https://github.com/rifraf/IronRubyAppPackager#readme (o di attendere per me di riferire se funziona con la libreria sto cercando di incorporare)

Relazioni:

Il processo, mi sono andato a è...

  1. forcella e submodule tutti i progetti (IronRubyEmbeddedApps, IronRubyAppPackager, Servi della gleba, e Vendorize) da https://github.com/rifraf, e stato aggiunto tutti in una VS soluzione.Ho aggiornato tutti i progetti .NET4 e li ha fatti fare riferimento a un altro, piuttosto che incluso .net2 assemblee

  2. eseguito Vendorize a strappare tutte le dipendenze/pietre preziose D:\projects\SomeLibrary\lib_vendor_ eseguendo:

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

  3. Generato un progetto c# a D:\projects\SomeLibrary\lib\_IRPackager_\some_lib.csproj eseguendo:

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

  4. Aggiunto il some_lib.csproj per la mia soluzione, aggiornato per .net4 e riferimenti fissi

  5. A questo punto, è possibile eseguire il progetto .NET standalone, eseguendo
var Ruby = new EmbeddedRuby();
Ruby.Decoder = new Program.GZipDecoder();
Ruby.Mount("App");
Ruby.Run("gocardless.rb");

E ' riuscito!Brillante, ho pensato!

In realtà a questo punto ho scoperto che aveva fallito nel passaggio 2 per Vendorize ogni singola libreria necessaria.Vendorize opere di intercettazione require chiamate e quindi salvare l'chiamato rb file di sconto per le _Vendor_ - se require non viene eseguito (quindi di eseguire tutti i test e la speranza di test di copertura è del 100%) non essere ritirati.

Per qualche motivo, non era riprendendo uno dei file richiesti, anche se non c'era un bisogno.Alla fine, ho creato manualmente il contenuto per il fornitore directory copiando la mia libreria, e utilizzando bundle install --deployment comando.Ripetere il passaggio 3 e 4 e ho finito...giusto?

No, mi viene l'errore su no such file to load -- json/pure quando ho eseguito il progetto generato - penso che questo sia qualcosa a che fare con una combinazione di ironruby non avere un json nativo di attuazione, mi fa il manuale vendorizing e me di dover bodge cose in più punti oggi.

Per concludere questo metodo molto molto quasi funziona, funziona se la tua libreria e dipendenze di lavoro con ironruby correttamente, e si può ottenere vendorize per funzionare correttamente.

Sto dando il massimo e il porting della libreria in c#, alla vecchia maniera.

edit:come indicato di seguito, rifraf mi sta aiutando, e stanno aggiornando gli strumenti che stavo usando.guarda t(sua) di spazio!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top