Je peux compiler, obtenir une instance et appeler une méthode de n'importe quel programme C#. Il y a beaucoup d'informations à ce sujet, y compris le StackOverflow (How can I evaluate a C# expression dynamically?). Mon problème est que je suis dans l'environnement web et que je ne peux rien enregistrer dans le répertoire/bin. Je peux compiler "en mémoire" comme le suggère le lien ci-dessus mais je ne serai pas capable de "décharger" mon assembly personnalisé de l'AppDomain actuel. Après un certain temps, cela deviendra un énorme problème de mémoire. Est-il possible d'ouvrir un nouvel AppDomain, de compiler un nouvel assembly "en mémoire", d'évaluer une expression ou d'accéder à un membre de cet assembly à l'intérieur de ce nouvel AppDomain et de tuer ce AppDomain en toute sécurité une fois terminé, tout cela sans rien sauvegarder sur un disque dur ? Merci d'avance pour tous les liens, suggestions, etcPuis-je compiler et exécuter une expression C# sans enregistrer l'assembly sur le disque?
Répondre
Avez-vous jeté un oeil au type DynamicMethod dans .Net? Ce type crée la récupération de place activée dans les méthodes de mémoire à l'aide de Reflection.Emit. Cela ressemble exactement à ce que vous cherchez.
J'ai complètement raté toute la chose DynamicMethod. Lire déjà ... Je ne vois toujours pas comment l'utiliser pour évaluer une chose simple comme b = Evaluate ("5 <6"). Vous cherchez plus, en espérant que je manque quelque chose. Je vous remercie! – Sasha
L'auteur dit aussi ce que j'ai dit dans ma question: soit vous êtes coincé avec un énorme problème de mémoire ou vous exécutez un nouveau code dans son propre AppDomain. Mais l'article lui-même était amusant, merci pour le partage! – Sasha
Si vous avez uniquement besoin d'accéder à une méthode arbitraire d'un type connu (et non à la compilation d'une expression plus complexe), vous pouvez utiliser la méthode GetMethod de la classe Type et Delegate.CreateDelegate. J'essaierais d'éviter d'utiliser un nouveau AppDomain, si possible, car il peut y avoir beaucoup de nouvelle complexité pour obtenir le bon Marshaling. –
J'ai à peu près besoin d'évaluer une expression C# à la volée. Le même vieux bool r = Eval ("3> 2"); où l'Eval est tout ce qui pourrait m'aider à évaluer le bool sans toucher le disque. Donc, non, la réflexion seule ne va pas aider ici. Merci, cependant :) – Sasha