Question

J'ai un projet C # dans lequel j'ai intégré un programme IronRuby. Le projet (y compris mon script Ruby) est compilé dans un fichier .exe dans Visual Studio 2010 pour la distribution. J'utilise un modèle similaire à celui pour bootstrapping le script IronRuby: http://pastebin.com/NKes1cyc ( et Jimmy Schementi va plus en détail ici: http: //blog.jimmy.schementi.com/2009/12/ironruby-rubyconf-2009-part-35.html ).

Mon problème. Je voudrais intégrer une pierre précieuse (de json_pure) dans mon assemblée C # et l'appeler à partir du script Ruby

Quelques ressources que j'ai trouvé:

  1. Dans JRuby, vous pouvez facilement emballer un bijou dans un fichier jar puis simplement exiger le fichier jar lors de l'exécution - http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6- gemmes-in-a-pot

  2. L'outil irpack ( http://github.com/kumaryu/irpack ) est capable de compiler Ruby dans un .exe (je pense qu'il crée de façon dynamique et compile un projet C #) tout en intégrant la bibliothèque standard de rubis. Mais on dirait qu'il est Embedding que les IronRuby pré-construits .DLLs, pas ruby ??fichiers .rb. L'approche cet outil utilise fonctionnerait si je pouvais comprendre comment compiler les fichiers sources Ruby dans un .dll.

Comment puis-je intégrer un joyau IronRuby dans un ensemble C # (ou compilent un joyau IronRuby à un .dll)?

EDIT:

Page 472 de IronRuby En action ( "Utilisation des bibliothèques externes") explique comment exiger des bibliothèques standard de Ruby à partir d'un fichier ruby ??intégré. Il consiste à ajouter le dossier (s) à la collection des chemins de recherche d'exécution, comme suit (modifié par souci de concision et de clarté):

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)

Cette approche suppose que la machine hôte a IronRuby installé, mais je veux les fichiers Ruby Embed (à partir d'un petit bijou) dans l'ensemble il peut être exécuté sans IronRuby pré-installé.

EDIT 2 (d'autres recherches):

En lisant le code source de l'outil irpack référencé ci-dessus, je remarque que Kumaryu est l'incorporation des ressources dans l'assemblage final par la classe System.IO.Packaging.Package, et en faisant passer le paquet dans l'appel à msbuild (voir < a href = "https://github.com/kumaryu/irpack/blob/master/lib/irpack/packager.rb" rel = "noreferrer"> https://github.com/kumaryu/irpack/blob/master/ lib / irpack / packager.rb ). Peut-être que d'autres recherches dans les fichiers d'emballage dans un fichier exécutable conduirait à une solution. Le problème que je vois est que les fichiers rubis dans un bijou require autres fichiers ... Ruby peut un fichier ruby ??dans un package d'assemblage require autres fichiers rubis dans le même paquet?

EDIT 3:

Je n'ai pas obtenu plus loin à une réponse, mais je serais intéressé d'entendre les commentaires de tout le monde, même si elle est juste un lien ou une suggestion sur l'endroit où regarder. Je suis nouveau à MSBuild, et la documentation est assez lourde. Une recherche sur le Web initial pour "msbuild package zip intégrer" n'a pas révélé quoi que ce soit pertinent.

Était-ce utile?

La solution

requise est un procédé qui peut être substituée comme toute autre méthode de rubis. Je pense que c'est la façon dont le paquet de pierres précieuses rubis d'origine a travaillé, des pierres précieuses seraient tout simplement passer outre require.

Si vous pouvez emballer la pierre précieuse dans votre .exe en quelque sorte, vous pouvez passer outre require à la charge de l'ensemble.

Autres conseils

Je travaille avec https://stackoverflow.com/users/2086/mcintyre321 pour obtenir sa bibliothèque enveloppé en C # / IronRuby en utilisant mon code d'emballage ( https://github.com/rifraf/IronRubyAppPackager#readme).

Il y a des corrections nécessaires à l'étape de vendorize qui sont liées aux versions ultérieures de Ruby ayant RubyGems intégrés plutôt que chargés, mais les progrès ont été faits.

Son code exige « json », et j'ai un truc pour le forcer à utiliser la mise en œuvre Ruby plutôt que le C-liaison .so. Cela devrait signifier que cela fonctionnera avec ok IronRuby. Fera rapport, ou ne hésitez pas à me contacter avec la source que vous voulez exécuter.

https://github.com/rifraf/IronRubyAppPackager#readme (ou attente pour moi de faire rapport si cela fonctionne avec la bibliothèque, je suis en train de intégrez)

retour de rapport:

Le processus je suis allé à est ...

  1. fourche et tous les sous-module projets (IronRubyEmbeddedApps, IronRubyAppPackager, Serfs et Vendorize) à partir de https://github.com / RifRaf , et les ajoute tout dans une solution VS. Je mis à jour tous les projets à .NET4 et les a fait une référence à une autre, plutôt que les ensembles .NET2 inclus

  2. exécuté Vendorize à déchirer toutes les dépendances / pierres précieuses D:\projects\SomeLibrary\lib_vendor_ en exécutant:

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

  3. généré un projet c # à D:\projects\SomeLibrary\lib\_IRPackager_\some_lib.csproj en exécutant:

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

  4. Ajout de la some_lib.csproj à ma solution, mis à jour à .net4 et références fixes

  5. À ce stade, vous pouvez exécuter le projet dans .NET, autonome, en exécutant
var Ruby = new EmbeddedRuby();
Ruby.Decoder = new Program.GZipDecoder();
Ruby.Mount("App");
Ruby.Run("gocardless.rb");

Et il a réussi! pensée brillante I!

En fait, à ce stade, je découvre qu'il avait échoué à l'étape 2 à Vendorize chaque bibliothèque requise. Vendorize travaux en interceptant les appels require et puis enregistrez les fichiers rb appelés hors du _Vendor_ -. Si require n'est pas exécuté (exécuter si tous les tests et l'espoir couverture de test est de 100%), il ne sera pas pris

Pour une raison quelconque, il ne captait pas un des fichiers nécessaires, même si il y avait un besoin. En fin de compte, j'ai créé manuellement le contenu du répertoire fournisseur en copiant ma bibliothèque, et en utilisant la commande bundle install --deployment. Répétez l'étape 3 et 4 et je suis fait ... droit?

Non, je reçois une erreur au sujet no such file to load -- json/pure quand je lance le projet généré - Je pense que cela est quelque chose à faire une combinaison de IronRuby ne pas avoir une implémentation JSON native, me faire le vendorizing manuel et avoir à me bodge les choses en plusieurs points aujourd'hui.

Pour conclure -. Cette méthode très presque fonctionne, ne fonctionnera que si votre bibliothèque et dépendances travail avec IronRuby correctement, et vous pouvez obtenir vendorize fonctionne correctement

Je donne et le portage de la bibliothèque c # à l'ancienne.

edit: comme mentionné ci-dessous, RifRaf me aide et à la recherche dans la mise à jour des outils que j'utilisais. regarder t (son) espace!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top