Rendez vos programmes dynamiques avec .NET
Rendez vos programmes dynamiques avec .NET
Richard Clark
(Vu 15059)
Français C# ASP .NET Expert Article

Dans le framework .NET existe la classe ICodeCompiler, très pratique pour rendre votre code dynamique. Qu'est-ce que du code dynamique ? C'est la génération est l'utilisation de code C#, VB.NET ou JScript à la volée.

Rendez vos programmes dynamiques avec .NET

Par Rémi Thomas de Pixel Technology, MVP .NET

Dans le framework .NET existe la classe ICodeCompiler, très pratique pour rendre votre code dynamique.
Qu'est-ce que du code dynamique ?  C'est la génération est l'utilisation de code C#, VB.NET ou JScript à la volée.

ICodeCompiler compile le code et génère un assembly. La réflexion vous permet d'invoquer les méthodes des assembly, et ainsi le code que vous venez de générer.

Je vous propose un exemple complet qui va interpréter des formules mathématiques pour créer des courbes en 3D.

Dans la zone de saisie on entre la formule mathématique, l'appuie sur "Use" génère l'assembly avec la fonction transformée en MSIL, et la courbe est actualisée.

Dans notre exemple il faut saisir du code C#. Cela va bien plus loin qu'un simple interpréteur de fonction mathématique !

La génération et l'utilisation de l'assembly est regroupé dans la classe DynaFormula du projet. La méthode EmitFormula provoque la compilation et prépare l'assembly à son utilisation.

Voici le code nécessaire pour générer et utiliser du code dynamique. Ici, pour simplifier, aucun test d'erreur, reportez vous aux sources pour avoir la gestion des erreurs.

// Le container C#
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
// Le compilateur MSIL
ICodeCompiler icc = codeProvider.CreateCompiler();
CompilerParameters parameters = new CompilerParameters();
// Génération d'une DLL
parameters.GenerateExecutable = false;
// en mémoire
parameters.GenerateInMemory = true;
// Fabrication du code final
string sourceCode = "using System;";
sourceCode += "namespace dyna {";
sourceCode += "public class Formula";
sourceCode += "{";
sourceCode += "public virtual double fy(double x, double z)";
sourceCode += "{";
sourceCode += formula; // ici la formule utilisateur
sourceCode += "}";
sourceCode += "}";
sourceCode += "}";
// Faire la compilation
CompilerResults results = icc.CompileAssemblyFromSource(parameters,sourceCode);

// Pour utiliser l'assembly, créer une instance
Object instance = results.CompiledAssembly.CreateInstance("dyna.Formula");
Type type = instance.GetType();
// Invoquer la méthode
Object[] args = new Object[2];
args[0]=1.2;
args[1]=1.3;
double fy = (double)type.InvokeMember("fy", BindingFlags.InvokeMethod, null, instance, args);
// fy contient la valeur f(1.2,1.3)

Le reste du programme s'occupe de l'affichage 3D, une rotation en temps réel est possible en déplaçant la souris dans la zone de visualisation.

Il ne reste plus qu'à faire fonctionner votre imagination et réviser vos maths pour générer de belles courbes 3D.

Le code source, le binaire

Rémi THOMAS

Richard Clark
Richard Clark

Vos commentaires

Vous devez être identifié pour pouvoir commenter l'article.

Identification - S'inscrire