Question

Je suis récemment tombé sur une brève discussion sur un autre site concernant la compilation runtime C # alors que je recherchais quelque chose d'autre et que l'idée était intéressante. Avez-vous déjà utilisé cela? J'essaie de déterminer comment et quand on pourrait utiliser ceci et quel problème cela résout. Je serais très intéressé de savoir comment vous l'avez utilisé ou dans quel contexte cela a un sens.

Merci beaucoup.

Était-ce utile?

La solution

En général, je vois ceci utilisé dans les cas où vous utilisez actuellement Reflection et devez optimiser les performances.

Par exemple, au lieu d'utiliser réflexion pour appeler la méthode X, vous générez une méthode dynamique au moment de l'exécution pour le faire à votre place.

Autres conseils

Vous pouvez l'utiliser pour ajouter une prise en charge de script à votre application. Pour des exemples, regardez ici ou ici .

Il est très facilement possible de publier des parties de votre infrastructure d'objet interne dans la partie script, vous pouvez donc ajouter relativement facilement à votre application quelque chose qui a le même effet que par exemple VBA pour Office.

J'ai déjà vu ceci (compilation / utilisation à l'exécution des classes System.Reflection.Emit) lors de la génération de proxies dynamiques ( Exemple de projet de code ) ou un autre moyen d'optimiser les appels de réflexion (en termes de temps).

Au moins un cas que vous pourriez utiliser est celui utilisé pour générer du code dynamique. Par exemple, la structure utilise cela en interne pour générer des sérialiseurs XML à la volée. Après avoir examiné une classe au moment de l'exécution, il peut générer le code pour sérialiser / désérialiser la classe. Il compile ensuite ce code et l’utilise au besoin. De la même manière, vous pouvez générer du code pour gérer des tables de base de données arbitraires, etc., puis compiler et charger l’assembly généré.

Eh bien, tout le code C # est compilé au moment de l’exécution, car c’est un compilateur JIT (juste à temps). Je suppose que vous faites référence à Reflection.Emit pour créer des classes, etc. à la volée. Voici un exemple que j'ai vu récemment dans la bibliothèque Xml-Rpc.Net.

Je crée une interface C # ayant la même signature que les appels de méthode d'un service XML-RPC, par exemple.

IMyProxy : IXmlRpcProxy
{
    [XmlRpcMethod]
    int Add(int a, int b);
}

Puis, dans mon code, j'appelle quelque chose comme

IMyProxy proxy = (IMyProxy)XmlRcpFactory.Create(typeof(IMyProxy));

Ceci utilise la génération de code au moment de l'exécution pour créer un proxy entièrement fonctionnel pour moi. Je peux donc l'utiliser comme suit:

int result = proxy.Add(1, 2);

Ceci gère ensuite l'appel XML-RPC pour moi. Plutôt cool.

J'ai utilisé les services de compilateur d'exécution de .NET dans ma thèse. En gros, il s'agissait de créer visuellement un composant graphique pour une visualisation de processus, généré sous forme de code C #, compilé dans un assemblage et pouvant ensuite être utilisé sur le système cible sans être interprété, pour le rendre plus rapide et plus compact. De plus, les images générées pourraient être regroupées dans le même assemblage que les ressources.

L'autre utilisation de cela était en Java. J'avais une application qui devait tracer une fonction potentiellement coûteuse en utilisant un algorithme numérique (de retour à l'université) que l'utilisateur pouvait entrer. Je mets la fonction entrée dans une classe, la compile et la charge, qui est alors disponible pour une exécution relativement rapide.

Voilà donc mes deux expériences où la génération de code d'exécution était une bonne chose.

Je l’utilisais pour permettre à l’utilisateur ad-hoc d’exécuter du code C # et VB. Ils pourraient taper une ligne de code (ou quelques lignes) et celle-ci serait compilée, chargée dans un domaine d'application, puis exécutée, puis déchargée. Ce n’est probablement pas le meilleur exemple de son utilisation, mais un exemple sans aucun doute

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