Bonjour,
Aller, un petit tutoriel s'impose :
Qu'est-ce que CodeDom?Ce sont des classes du .Net Framework qui permettent de générer du code VB.Net, C# et (anciennement) J#.
Quel est l'intérêt?C'est d'abord plus rapide à générer que du simple texte (je sais, au premier point de vue ça semble illogique mais jugez par les performances entres SZ 2011 et 2012, elles sont bien meilleurs). C'est également assez souple, on peut générer tout type de code .Net, des classes complètes. Pour vous donner une idée, les codes générés pour les fenêtres sont entièrement écrit par une valeur CodeDom, et encore une fois, c'est plus rapide qu'avec un simple texte. L'intérêt est également de pouvoir lire facilement le code sans avoir besoin de créer son propre système de lecture et d'analyse du code, souvent pas très stable (même pour moi). On retrouve cet avantage dans la fonction permettant de passer du code VB.Net aux paramètres de l'action.
Comment on l'utilise?Il faut dans un premier temps créer une valeur CodeDom :
- Code:
Dim MonCodeDom As New System.CodeDom.AssignStatement(New System.CodeDom.CodeVariableReferenceExpression("Variable1"), New System.CodeDom.CodeVariableReferenceExpression("Variable2"))
Le code ci-dessus permettra de générer le code suivant :
- Code:
Variable1 = Variable2
"AssignStatement" définie une assignation, et "CodeVariableReferenceExpression" définie une référence à une variable. Il y a plein d'autre fonctions, elle permet de faire référence à des méthodes, fonctions, types, conditions, boucles, assignation, déclaration de variables, de méthodes...etc
Seulement voila, comment on passe de la valeur CodeDom à du code VB.Net ou C# généré? Il suffit d'utiliser une fonction dans .Net qui va traduire la valeur en code :
- Code:
Dim sourceWriter As New IO.StringWriter()
CodeDom.Compiler.CodeDomProvider.CreateProvider("VB").GenerateCodeFromStatement(MonCodeDom, sourceWriter, New CodeDom.Compiler.CodeGeneratorOptions())
sourceWriter.Close()
MsgBox("Le code généré est : " & sourceWriter.ToString())
Le code ci-dessus génère le code VB.Net (grâce à la partie CreateProvider("VB") du code. Si vous voulez du C#, mettez C à la place de VB) en fonction de la valeur CodeDom contenu dans la variable MonCodeDom.
Note : dans SZ, on doit générer le code VB.Net pour l'afficher dans la fenêtre des paramètres d'un action. En revanche on renvoie la valeur CodeDom brut à SZ pour la génération, et SZ s'occupera de générer tous les codes d'un coup, car, pendant la génération, il assemble un énorme bloc de CodeDom (qui forme votre projet) avant de le compiler (la génération est plus rapide que sous SZ 2011, vous l'aurez sûrement remarqué).
Et si je n'arrive vraiment pas à utiliser CodeDom?Pas de panique : on peut toujours utiliser du texte. Il suffit de retourner une valeur comme celle-ci :
- Code:
New System.CodeDom.CodeSnippetExpression("Variable1 = Variable2")
Dans ce cas, pour les fenêtre des paramètres de l'action, vous pouvez très bien travailler uniquement avec du texte. Mais pour la fonction GetVBCode de votre action, il faudra retourner une valeur CodeDom (tel que celle ci-dessus si vous ne voulez pas tout générer avec CodeDom).
Au final, utiliser CodeDom est un bénéfice en performance. Évidemment, sur une seule action, on ne voit pas de différence, mais quand on a des projets avec 300 actions, on s’aperçoit que c'est bien plus rapide qu'avec du simple texte (je compare encore à SZ 2011 à ce moment là).
En espérant vous avoir éclairci un peu
[EDIT]
Voici un petit tutoriel sur CodeDom, en C#. Mais pas de panique, c'est pareil en VB.Net, il y a juste la syntaxe qui change :
http://vincentlaine.developpez.com/tuto/dotnet/codedom/