Vous êtes sur la page 1sur 17

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008

par Paul Musso (Blog)


Date de publication : 05 novembre 2008 Dernire mise jour :

Cet article dcrit comment crer, tester et dployer un Custom Tool en utilisant Visual Studio 2008

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog)

Avant-Propos................................................................................................................................................................ 3 1 - Qu'est ce qu'un Custom Tool ?..............................................................................................................................3 2 - Objectif du Custom Tool propos dans l'exemple................................................................................................. 4 3 - Ralisation..............................................................................................................................................................5 3.1 - Prrequis logiciels..........................................................................................................................................5 3.2 - Cration du projet..........................................................................................................................................5 3.3 - Implmentation de la classe principale : HelloCustomTool........................................................................... 6 3.4 - Implmentation de la classe Generator........................................................................................................ 7 4 - Test du Custom Tool l'aide d'une application Console..................................................................................... 10 5 - Dploiement du Custom Tool.............................................................................................................................. 12 Conclusion..................................................................................................................................................................16

-2Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog)

Avant-Propos
Souvent, nous utilisons des Custom Tools sans le savoir. Ces outils simplifient le quotidien du dveloppeur en gnrant par exemple des classes utilitaires partir de fichiers XML. Visual Studio propose dj un ensemble de Custom Tools, comme un gnrateur de code pour les fichiers de ressources et de configuration. Ces outils permettent de gagner un temps non ngligeable pendant la phase de dveloppement d'un projet. Il est bien plus facile d'accder aux valeurs d'un fichier de ressources par l'intermdiaire d'une classe qu'en ralisant une requte XPath ou LinQ. Visual Studio offre la possibilit de crer de tels outils et cet article explique chaque tape de la cration d'un Custom Tool. Dans un 1er temps, nous verrons ce qu'est un Custom Tool et quoi sert le Custom Tool propos par l'article. Dans une 2me partie, nous crerons une librairie o nous implmenterons le Custom Tool. Une fois cr, nous le testerons avec une application console. Finalement, nous raliserons un programme d'installation afin de le dployer aisment. Il est noter que le langage utilis est le C#, mais qu'il est possible de traduire le code de l'article en VB .Net. assez facilement.

1 - Qu'est ce qu'un Custom Tool ?


Un Custom Tool n'existe pas sans parler de Visual Studio. On peut dire simplement que c'est un gnrateur de code. Visual studio utilise par exemple un Custom Tool pour gnrer la classe utilitaire associe un fichier de type " resx ". Celui-ci prend en entre le fichier de ressource et construit une classe facilitant l'accs aux donnes XML. On en dduit qu'un Custom Tool accepte un fichier en entre et cre un fichier en sortie.

Le fichier cr est rattach au fichier source. Visual Studio le traduit visuellement comme cela :

La plupart des Custom Tools gnre du code partir de fichiers XML. Mais il est possible de faire l'inverse ou par exemple de gnrer un fichier de documentation partir d'une classe commente. On remarque que tout fichier contenu dans un projet Visual Studio peut avoir un Custom Tool rattach. Ceci est visible dans la fentre de proprit :
-3Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog)

Pour excuter un Custom Tool, il suffit de sauvegarder le fichier o le Custom Tool est rattach. Ceci a pour effet d'excuter la mthode " Generate " dfinit par l'interface " IVsSingleFileGenerator " de l'outil, que nous prsenterons plus en dtail lors de la phase d'implmentation. La mthode gnre ensuite le fichier en sortie et Visual Studio 2008 l'attache au fichier source.

2 - Objectif du Custom Tool propos dans l'exemple


L'exemple choisit cre un Custom Tool qui utilise en entre un fichier XML de dclaration de champs " fields " pour un site SharePoint, et produit une classe facilitant l'accs aux donnes. Le Custom Tool propos permet de rcuprer l'identifiant unique (GUID) et le nom de chaque champ dclar dans le fichier XML. L'outil gnre ensuite une classe statique compose de proprits statiques retournant les identifiants de chaque champ. Voici un extrait du fichier XML utilis (se trouvant dans l'archive compresse de l'article) :

-4Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog)

3 - Ralisation 3.1 - Prrequis logiciels


Voici la liste des composants logiciels ncessaires pour la ralisation du Custom Tool : Microsoft Visual Studio 2008 (Toutes les versions sauf Express). Prfrez la version anglaise, car l'article se base dessus. Cependant, il est facile de traduire les rfrences anglophones. Microsoft Visual Studio 2008 SDK ( http://www.microsoft.com/downloads/details.aspx? familyid=30402623-93ca-479a-867c-04dc45164f5b&displaylang=en) L'archive de l'article (Lien HTTP). Celle-ci contient notamment le fichier XML de rfrence pour le Custom Tools, s'appelant " fields.xml ". Elle contient l'intgralit du code source du Custom Tool.

3.2 - Cration du projet


Tout d'abord, il est ncessaire de crer un projet de type " Class Library ". Nommez le " HelloCustomTool " et cochez la case " Create directory for solution ". Laissez le nom de la solution comme tel et finalement validez la cration du projet.

-5Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog)

Une fois le projet cr, il faut ensuite dfinir une rfrence l'assembly " Microsoft.VisualStudio.Shell.Interop ". Celuici est fourni dans le SDK de Visual Studio que vous avez pralablement tlcharg. Cliquez avec le bouton droit sur le projet dans l'explorateur de solution et slectionnez " Add reference ". Dans l'onglet " .Net ", vous trouvez l'assembly. Avant de commencer dvelopper le Custom Tool, il est ncessaire de signer la librairie. Allez dans les proprits du projet (Clic droit sur le projet, puis slectionnez Properties). Dans l'onglet " Signing ", signez fortement l'assembly avec une nouvelle cl. Nommez-la " key.snk " et dsactivez la protection par mot de passe. Renommez ensuite le fichier " Class1.cs " en " HelloCustomTool.cs ". Nous sommes enfin prts implmenter le Custom Tool.

3.3 - Implmentation de la classe principale : HelloCustomTool


Ajoutons tout d'abord les clauses " using " ncessaires la classe " HelloCustom Tool " :
using using using using System; System.CodeDom.Compiler; System.Runtime.InteropServices; Microsoft.VisualStudio.Shell.Interop;

Dans un 2me temps, faites hriter la classe " HelloCustomTool " de l'interface " IVsSingleFileGenerator " et dfinissez les corps des mthodes suivantes " Generate " et " DefaultExtension ". Nous devons ensuite attacher un identifiant unique notre classe. Pour cela, utilisez un attribut " Guid ". Allez dans le menu " Tools " et slectionnez " Create GUID ". Choisissez l'option 4 et appuyez sur le bouton " Copy " et " Exit ". Ajoutez ensuite un attribut " Guid " la classe " HelloCustomTool " et passez en paramtre l'identifiant stock dans le presse papier (Ctrl+V). Voici le code de la classe " HelloCustomTool " :
namespace HelloCustomTool { [Guid("E9832F96-4614-4530-ABF6-0438953D2355")] public class HelloCustomTool : IVsSingleFileGenerator { /// /// Determine l'extension du fichier cr /// /// /// public int DefaultExtension(out string pExt) -6Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog) { }

pExt = ".cs"; return 0;

/// /// Mthode appele lors de la sauvegarde du fichier source /// /// Chemin du fichier source /// Contenu du fichier source /// /// Pointeur stockant l'adresse du contenu gnr /// Taille du contenu gnr /// Indicateur de progression du Custom Tool /// public int Generate(string pInputFilePath, string pInputFileContents, string pNamespace, IntPtr[] pOutputFileContents, out uint pOutputFileContentSize, IVsGeneratorProgress pGenerateProgress) { if (pInputFileContents == null) throw new ArgumentNullException(pInputFileContents); // Cration du fournisseur de code permettant de transformer un graphe d'instructions et d'expressions en code CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("C#"); // Gnration de la classe "Fields" compose de proprits statiques renvoyant des GUID byte[] generatedStuff = Generator.GenerateCode(pInputFileContents, codeProvider, pNamespace, pGenerateProgress); if (generatedStuff == null) { pOutputFileContents[0] = IntPtr.Zero; pOutputFileContentSize = 0; } else { // Copie du flux en mmoire pour que Visual Studio puisse le rcuprer pOutputFileContents[0] = Marshal.AllocCoTaskMem(generatedStuff.Length); Marshal.Copy(generatedStuff, 0, pOutputFileContents[0], generatedStuff.Length); pOutputFileContentSize = (uint)generatedStuff.Length; } } } } return 0;

La fonction " DefaultExtension " permet de dfinir l'extension du fichier cr par le Custom Tool. Elle prend en paramtre l'extension renvoyer. La mthode " Generate " est appele pour gnrer le fichier en sortie. Dans le corps de celle-ci, une instance de la classe " CodeDomProvider " est cre. Celle-ci permet de gnrer le code au format souhait (ici en C#) partir d'un graphe d'instructions et d'expressions. Ce graphe est construit grce aux classes et mthodes de la bibliothque " CodeDom ". La chaine de caractres " pInputFileContents" contient l'intgralit du fichier XML. Cette chaine servira gnrer la classe " Fields " avec ses proprits. Notez l'appel la mthode " Generator.GenerateCode ". Celle-ci prend en entre le contenu du fichier XML, le provider de code cr, l'espace de nom ainsi que l'indicateur de progression du Custom Tool. Dans la prochaine partie, nous allons crer la classe " Generator " qui a pour rle de gnrer le code de la classe " Fields ".

3.4 - Implmentation de la classe Generator


Commencez par ajouter une classe au projet " HelloCustomTool ". Nommez cette classe " Generator ". Voici la liste des " using " insrer dans notre nouvelle classe:
-7Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog)

using using using using using using using using using

System; System.CodeDom; System.CodeDom.Compiler; System.IO; System.Reflection; System.Runtime.InteropServices; System.Text; System.Xml; Microsoft.VisualStudio.Shell.Interop;

Avant d'implmenter la mthode " GenerateCode ", rendez la classe publique et statique en ajoutant les mots cls " public " et " static " comme suit :
namespace HelloCustomTool { public static class Generator {

Voici le corps de la mthode " GenerateCode " :


/// /// Mthode gnrant la classe publique contenant l'ensemble des accesseurs statiques /// /// Contenu du fichier XML /// Objet servant gnrer le code partir du graph d'instructions et d'expressions cr /// Indicateur de progression du Custom Tool /// Tableau d'octets reprsentant le code de la classe gnre public static byte[] GenerateCode(string pInputFileContents, CodeDomProvider pCodeProvider, string pNamespace, IVsGeneratorProgress pCodeGeneratorProgress) { CodeCompileUnit compileUnit; StreamWriter writer = new StreamWriter(new MemoryStream(), Encoding.UTF8); XmlDocument doc = new XmlDocument(); doc.LoadXml(pInputFileContents); // Generate class graph compileUnit = CreateClass(doc, pNamespace); if (pCodeGeneratorProgress != null) pCodeGeneratorProgress.Progress(0x4b, 100); // Generate Code pCodeProvider.GenerateCodeFromCompileUnit(compileUnit, writer, null); if (pCodeGeneratorProgress != null) { int errCode = pCodeGeneratorProgress.Progress(100, 100); if (errCode < 0) { Marshal.ThrowExceptionForHR(errCode); } } writer.Flush(); return writer.BaseStream.StreamToBytes(); }

Dans un 1er temps, nous initialisons un objet " StreamWriter " qui permet de rcuprer sous forme de chaine de caractre le code cr. Le contenu XML de la variable " pInputFileContent " est ensuite charg dans un objet " XmlDocument " afin de rcuprer facilement les lments et attributs XML. Celui-ci est ensuite pass la mthode " CreateClass " charge de construire le graphe " CodeDom " reprsentant la classe. Le graphe en question est
-8Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog)

ensuite converti en code C# et stock dans l'objet " StreamWriter " cr pralablement. Et finalement, le code gnr est renvoy sous la forme d'un tableau d'octets (byte[]). Notons l'utilisation de la mthode " SteamToBytes " sur la proprit " BaseStream " de l'objet " writer ". En ralit, c'est une mthode d'extension dont voici la dfinition et l'implmentation :
/// /// Mthode renyant un tableau d'octets partir d'un flux /// /// /// public static byte[] StreamToBytes(this Stream pStream) { if (pStream.Length == 0) return new byte[0]; long pos = pStream.Position; pStream.Position = 0; byte[] buffer = new byte[(int)pStream.Length]; pStream.Read(buffer, 0, buffer.Length); pStream.Position = pos; } return buffer;

Insrez cette mthode dans la classe " Generator ". Voyons maintenant la mthode " CreateClass ", qu'il vous faut aussi insrer dans la classe " Generator " :
/// /// Mthode construisant la classe publique "Fields". /// Celle-ci appelle la mthode CreateFields qui ajoute les proprits statiques /// /// /// public static CodeCompileUnit CreateClass(XmlDocument pXmlDoc, string pNamespace) { // Configuration du graph CodeCompileUnit code = new CodeCompileUnit(); code.UserData.Add("AllowLateBound", false); code.UserData.Add("RequireVariableDeclaration", true); // Dfinition du namespace CodeNamespace nameSpace = new CodeNamespace(pNamespace); code.Namespaces.Add(nameSpace); // Dfinition de la classe publique "Fields" CodeTypeDeclaration classObject = new CodeTypeDeclaration("Fields"); nameSpace.Types.Add(classObject); classObject.TypeAttributes = TypeAttributes.Public; // Gnration des proprits statiques de la classe XmlElement rootElement = pXmlDoc.DocumentElement; XmlNodeList xmlFields = rootElement.GetElementsByTagName("Field"); CreateFields(classObject, xmlFields); CodeGenerator.ValidateIdentifiers(code); return code;

Cette mthode statique cre la classe publique " Fields " et insre pour chaque lment XML <Field> une proprit statique. Cette opration est d'ailleurs dlgue la mthode " CreateFields " que voici et que vous devez insrer dans la classe " Generator " :
/// /// Mthode qui ajoute une proprit statique pour chaque noeud XML /// -9Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog) /// /// public static void CreateFields(CodeTypeDeclaration pClassObject, XmlNodeList pXmlFields) { foreach (XmlNode xmlField in pXmlFields) { string propName = string.Empty, propId = string.Empty; // Rcupration des valeurs des attributs ID et Name if (xmlField.Attributes.GetNamedItem("ID") != null) propId = xmlField.Attributes.GetNamedItem("ID").Value; if (xmlField.Attributes.GetNamedItem("Name") != null) propName = xmlField.Attributes.GetNamedItem("Name").Value; // Cration de la proprit public et statique, renvoyant un guid // Exemple : // public static global::System.Guid TTT_Headlines { // get { return new System.Guid("{B6684A6E-FBF5-4223-9679-56A7B4C3A356}"); } // } Type propertyType = typeof(Guid); CodeTypeReference propertyTypeReference = new CodeTypeReference(propertyType, CodeTypeReferenceOptions.GlobalReference); CodeMemberProperty property = new CodeMemberProperty(); property.Name = propName; property.HasGet = true; property.HasSet = false; property.Type = propertyTypeReference; property.Attributes = MemberAttributes.Public | MemberAttributes.Static; // Cration de l'instruction return CodeMethodReturnStatement returnStatement = new CodeMethodReturnStatement(new CodeObjectCreateExpression(typeof(Guid), new CodePrimitiveExpression(propId))); property.GetStatements.Add(returnStatement); // Ajout de la proprit la classe "Fields" pClassObject.Members.Add(property);

Pour chaque lment <Field> contenu dans le fichier XML sont rcuprs les attributs " ID " et " Name ". L'attribut " Name " sert de nom pour la proprit statique et " ID " est utilis dans l'instanciation du GUID retourn. Chaque proprit gnre est ensuite ajoute la classe " Fields ". La classe " Generator " est ds prsent fonctionnelle. Cependant, nous allons tout d'abord test que le code gnr soit bien form. Pour cela, nous allons ajouter une application de type console notre solution.

4 - Test du Custom Tool l'aide d'une application Console


Cliquez avec le bouton droit sur la solution dans l'explorateur de solution et ajouter un nouveau projet. Choisissez le modle " Console Application ", nommez le projet " Test " et validez la cration. Il faut ensuite ajouter le projet " HelloCustomTool " en tant que rfrence dans le projet " Test ". Vous le trouverez dans l'onglet " Project " de la fentre " Add Reference ". Dans l'archive compresse de l'article, se trouve le fichier XML " fields.xml ". Rcuprez-le et ajoutez-le au projet en cliquant avec le bouton droit sur le projet " Test " dans l'explorateur de solution et en choisissant " Add Existing Item ". Slectionnez-le, validez et dfinissez la proprit " Copy to Output directory " " Copy Always " dans la fentre de proprit du fichier XML. Cette manipulation ordonne Visual Studio de copier le fichier XML dans le rpertoire de sortie du projet " Test " chaque compilation du programme.

- 10 Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog)

Voici le corps de la mthode " Main " de la classe " Program ". La logique suivante appelle la mthode " GenerateCode " en passant le contenu du fichier XML " fields.xml " sous forme de chane de caractres.
using System; using System.Xml; using HelloCustomTool; namespace Test { class Program { static void Main(string[] args) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("fields.xml"); string result = Generator.GenerateCode(xmlDoc.OuterXml); Console.WriteLine(result); Console.Read();

Afin de tester plus facilement notre Custom Tool, la mthode " GenerateCode " de la classe " Generator " a t surcharge par une nouvelle mthode ne prenant que le contenu du fichier XML en entre, dont voici l'implmentation :
/// /// Mthode de test du Custom Tool /// /// /// public static string GenerateCode(string pInputFileContents) { CodeCompileUnit compileUnit; StreamWriter writer = new StreamWriter(new MemoryStream(), Encoding.UTF8); XmlDocument doc = new XmlDocument(); doc.LoadXml(pInputFileContents); compileUnit = CreateClass(doc, "HelloCustomTool");

- 11 Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog) CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("C#"); codeProvider.GenerateCodeFromCompileUnit(compileUnit, writer, null); writer.Flush(); System.Text.Encoding enc = System.Text.Encoding.UTF8; } return enc.GetString(StreamToBytes(writer.BaseStream));

Rajoutez cette mthode la classe statique " Generator " de votre librairie " HelloCustomTool ". Nous sommes enfin prts tester notre Custom Tool ! Pressez la touche F5 pour compiler et lancer l'application de test. Auparavant, assurez-vous d'avoir slectionn le projet " Test " en tant que projet de dmarrage.

Normalement, vous devriez voir l'intgralit du code de la classe " Fields " gnre dans une fentre de commande.

5 - Dploiement du Custom Tool


Pour que Visual Studio puisse excuter notre Custom Tool, nous avons besoin de rajouter quelques cls dans la base de registres aux endroits suivants : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\CLSID HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Generators\{FAE04EC1-301F-11D3BF4B-00C04F79EFBC}

Nous allons profiter de notre programme d'installation pour dfinir automatiquement ces cls dans la base de registres. De mme, nous insrerons la librairie " HelloCustomTool " dans le GAC. Commenons par ajouter le 3me et dernier projet notre solution de type " Setup Project ". Nommez le " Installation " et validez sa cration.
- 12 Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog)

Il faut maintenant dfinir l'installation de la librairie " HelloCustomTool " dans le GAC. Faites un clique droit sur le projet " Installation " dans l'explorateur de solution et slectionnez " View > File System ". Sur la partie gauche de la fentre venant d'apparatre, faites un clic droit et slectionnez " Add Special Folder > Global Assembly Cache Folder ". Assurez-vous de slectionner ce nouveau rpertoire, et dans la partie droite, faites un clic droit et " Add > Project Output ". Validez la fentre qui apparat.

- 13 Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog)

Il ne reste plus qu' dfinir les cls dans la base de registre. Pour cela, slectionnez le projet d'installation dans l'explorateur de solution, cliquez droit dessus et slectionnez " View > Registry ". Dans l'arborescence gauche, crez les cls suivantes (clique droit sur un dossier et " New > Key "): HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\CLSID HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Generators\{FAE04EC1-301F-11D3BF4B-00C04F79EFBC}

Pour la cl " CLSID ", ajoutez une cl gale la valeur du GUID de la classe " HelloCustomTool ". Dans notre exemple le GUID correspond {E9832F96-4614-4530-ABF6-0438953D2355}.

- 14 Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog)

Ajoutez les chaines de caractres suivantes : (Default) : Hello Custom Tool (Description, laissez le champ (Name) vide) Assembly : HelloCustomTool, Version=1.0.0.0, Culture=neutral, PublicKeyToken=XXXXXXXXXX (Nom de l'assembly stock dans le GAC) Class : HelloCustomTool.HelloCustomTool (Nom complet de la classe du Custom Tool) InprocServer32: [SystemFolder]mscoree.dll ThreadingModel: Both

Voici ce que cela donne en image :

Pour rcuprer le PublicKeyToken de la librairie " HelloCustomTool ", vous pouvez utiliser l'utilitaire " sn.exe ". En ouvrant une fentre de commande Visual Studio 2008, placez vous dans le rpertoire " Debug " de votre projet " HelloCustomTool " et excutez la commande suivante : sn.exe -T HelloCustomTool.dll Vous pouvez aussi utiliser un " External Tool " ddi cela. Le lien suivant vous explique comment faire :

http ://blogs.msdn.com/miah/archive/2008/02/19/visual-studio-tip-get-public-key-tokenfor-a-stong-named-assembly.aspx
- 15 Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog)

Concernant la cl finissant par {FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}, celle-ci indique que notre Custom Tool concerne les projets C#. Rajoutez une cl nomme " HelloCustomTool " l'intrieur et dfinissez les valeurs suivantes : (Default) : Hello Custom Tool (Description du Custom Tool) CLSID: {E9832F96-4614-4530-ABF6-0438953D2355} (GUID de la classe HelloCustomTool) GeneratesDesignTimeSource (DWORD):1

Il ne reste plus qu' installer et tester votre Custom Tool. Pour cela, compilez votre projet d'installation. Fermez Visual Studio 2008, allez dans le rpertoire " Debug " de votre projet d'installation et double cliquez sur l'installeur. Une fois l'installation termine, relancez Visual Studio 2008, ouvrez la solution, slectionnez le fichier " fields.xml " et dans sa fentre de proprit, dfinissez " Custom Tool " " HelloCustomTool ". Ouvrez le fichier " Fields.xml " et faites un " Ctrl +S ". Vous verrez apparatre un fichier " Fields.cs " contenant votre classe " Fields ".

Conclusion
Cet article montre comment crer un Custom Tool dans Visual Studio 2008, le debugger et gnrer un programme d'installation. L'exemple peut servir de base pour crer d'autres Custom Tools qui simplifieront le travail du dveloppeur. Visual Studio 2008 propose bien d'autres technologies qui ont pour finalit de gnrer du code, comme

- 16 Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Gnration de code : Cration d'un Custom Tool pour Visual Studio 2008 par Paul Musso (Blog)

par exemple les DSL, pour " Domain Specific Language ". Ceux-ci permettent la cration de langages graphiques utiliss pour gnrer n'importe quel type de sortie, dont nous verrons la cration dans un prochain article. En dernier lieu, je tiens remercier Louis-Guillaume Morand pour son aide prcieuse.

- 17 Les sources prsentes sur cette pages sont libre de droits, et vous pouvez les utiliser votre convenance. Par contre cette page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2008 - Paul Musso. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrets. Droits de diffusion permanents accords developpez LLC.

Vous aimerez peut-être aussi