Introduction

Programmer, c'est comme écrire, il y a ceux qui ont du style, ceux qui n'en ont pas, ceux qui font des fautes, et les autres. Même si tout langage de programmation, et toute technologie impose des contraintes, des syntaxes et des règles précises, il n'empêche que la même application écrite par dix développeurs différents ne sera jamais exactement la même. Chaque personne à une manière différente de tourner des algorithmes, de nommer des variables ou je ne sais encore quel détail qui fait le style d'un développeur. Cependant, même si un code ne peut pas être strictement prédéfinit, il doit quand même satisfaire un certain nombre d'exigences, en termes de design et de syntaxe. Toutes ces règles et normes, sont définies pour apporter le meilleur niveau de performance et de standardisation possible aux applications. Il faut prendre ces termes au sens large, en effet, cela concerne les performances brutes, mais aussi la sécurité, les conventions de nommage, le design... Toutes ces mesures qui font qu'un programme est écrit dans les règles de l'art ou non. Rares, voir même inexistants, sont les développeurs capables d'écrire ce code "parfait" au premier jet, sans avoir à y revenir.

Microsoft .Net



Ces règles et nomenclatures sont nombreuses, et parfois complexes. De plus, celles-ci ne sont pas gravées dans le marbre, et de ce fait peuvent évoluer, ou être différentes d'une société à une autre. Cet ensemble fait qu'il est complexe, coûteux en temps et peu motivant de parcourir ses lignes de code à la recherche des éléments à modifier pour se conformer aux différentes exigences. Et une fois de plus, le développeur a trouvé la parade, une application est capable de faire cela ! Elle se nomme FxCop. Bien entendu, ce n'est pas la seule application capable de réaliser une telle analyse, mais c'est l'une des plus connues, elle est gratuite, performante, et issue de la communauté des développeurs .Net. C'est donc pour toutes ces raisons que j'ai choisi de la présenter. J'avoue l'utiliser depuis quelques mois seulement, mais, elle me rend de fiers services en me procurant un code plus simple à maintenir, en évitant les grosses fautes, pouvant notamment avoir un impact sur les performances ou la sécurité d'une application. Avant de voir plus en détails FxCop, voyons tout d'abord où trouver ce logiciel, et comment l'installer.

1. Installer

FxCop, à l'heure où j'écris ces lignes est en version 1.35, et nécessite le Framework .Net 2.0. Cette version est capable d'analyser des assemblies issues de toutes les versions du Framework inférieures ou égales à la 2.0. Mais gageons que l'équipe de développement de FxCop saura réagir et adapter cet outil à la sortie prochaine du Framework 3.0, qui se fera parallèlement à la sortie de Windows Vista. Cet outil, gratuit je le rappelle, est disponible sur le site de GotDotNet. Par rapport à la version précédente (1.32), la 1.35 corrige plus de 150 bugs, rectifie certaines règles pouvant donner des résultats erronés, et ajoute cinq nouvelles règles.

Cet outil est disponible en téléchargement (environ 3.6 Mo) à cette adresse : http://www.gotdotnet.com/team/FxCop/

Pour l'installation même du programme, vous allez voir, il n'y a rien de compliqué, c'est juste du "next next ok"... Bref, à la portée de tout le monde. Le seul prérequis est le Framework .Net 2.0, en effet cette dernière version en a besoin pour s'exécuter. Vous admettrez que pour une application dont le but est d'analyser des assemblies .Net cela n'a rien de révoltant. Voici quelques captures d'écrans de l'installation :

Installation de FxCop


Choix du type d'installation de FxCop

Remarque : petite précision, FxCop fonctionnera quelque soit l'environnement de développement que vous utilisez ! Cela va donc de Notepad à Visual Studio 2005 Team Suite, en passant par SharpDevelop. En effet, FxCop est totalement indépendant de ces logiciels, et fonctionne de manière autonome.

2. Présentation

Tout d'abord je vais vous présenter FxCop et ses fonctionnalités dans les grandes lignes. Histoire de comprendre comment il fonctionne, ce que l'on peut en attendre ou non. Premièrement, vous devez savoir que cet outil travaille sur des assemblies "compilées" et non sur le code source, c'est-à-dire que son domaine de prédilection c'est le MSIL et non le VB.Net, C#, ou encore Delphi.Net... Ce détail a son importance, travaillant sur des assemblies et non sur du code source, FxCop est totalement indépendant vis-à-vis du langage de que vous avez employé pour votre programme, du moment bien évidemment qu'il s'agisse de .Net ! Mais est-ce bien utile de le préciser ?

Son principe de fonctionnement est le suivant : FxCop procède à une analyse méticuleuse du code MSIL d'une assembly, et vérifie que l'assembly est en conformité avec les règles qui lui sont associées. En effet, chaque point vérifié correspond en fait à une règle, qui, elle-même est issue des bonnes pratiques édictées par Microsoft. Bonnes pratiques, qui sont d'ailleurs publiquement connues, puisqu'en libre téléchargement sur le site MSDN. FxCop n'invente donc rien, mais compile et concentre en une seule application toutes ces bonnes pratiques. Quand on sait que la version 1.35 en contient plus de 200 on réalise alors la productivité apportée par un tel outil. Bien entendu, il est possible de choisir parmi toutes ces règles lesquelles doivent être vérifiées ou non, nous verrons même plus loin qu'il est possible de créer ses propres règles entièrement personnalisées. Une fois l'analyse complétée, dont la durée sera évidemment plus ou moins grande en fonction du nombre, de la taille, et de la complexité des assemblies chargées, un rapport est généré. Un premier tableau contient une liste comportant chaque anomalie détectée en précisant notamment le type, le niveau, le pourcentage de probabilité réelle du problème. D'autres informations sont également fournies, je vous laisse les découvrir. Le plus intéressant, concerne la partie basse de l'interface qui contient le détail de l'anomalie sélectionnée. Ici ce sont des informations très détaillées qui sont données, voici d'ailleurs en exemple une capture d'écran.

Liste des anomalies détectées
Liste des anomalies détectées



Détails d'une anomalie détectée par FxCop
Détails d'une anomalie



Comme vous pouvez le voir ci-dessus, FxCop propose une solution permettant de corriger le problème, et aussi un lien pointant vers une page décrivant plus précisément l'anomalie détectée, j'ai constaté qu'il arrive cependant que la page en question ne soit pas encore disponible, mais cela ne se produit pas dans la majorité des cas. La solution proposée prend en compte la spécificité de votre code. Des informations complémentaires sont également données, il est donc généralement facile de cerner l'anomalie qui a été repérée.

Les anomalies sont classées dans quatre catégories différentes :

  • Warning
  • Critical Warning
  • Error
  • Critical Error

Elles seront placées dans une de ces catégories en fonction de leur degré de gravité, leur nature et les conséquences qu'elles peuvent engendrer en cas de non correction.

Remarque : il faut préciser que, s'il est possible d'analyser plusieurs assemblies en même temps, celles-ci doivent utiliser la même version du Framework. Par exemple, analyser une assembly .Net 1.1 et une 2.0 en même temps ne sera pas possible.

3. Analyser ses assemblies

Après avoir étudié les principes de fonctionnement de FxCop, voyons maintenant comment procéder à l'analyse concrète d'assemblies. La première étape consiste à créer un nouveau projet d'analyse, pour cela il faut aller dans le menu "File" et choisir "New project". Ensuite, il faut sélectionner la, ou les assemblies à analyser, menu " Project ", "Add targets". FxCop charge alors le code à analyser. Voici une capture d'écran montrant à quoi doit ressembler le logiciel à cet instant.

Asembly à analyser chargée dans FxCop



Maintenant nous allons choisir les règles et bonnes pratiques que nous souhaitons vérifier avec FxCop. Cela se passe dans l'onglet "Rules", dans la partie gauche de l'interface. Les règles sont divisées en neuf catégories qui sont les suivantes :

  • Design rules
  • Globalization rules
  • Interoperability Rules
  • Mobility Rules
  • Naming Rules
  • Performance Rules
  • Portability Rules
  • Security Rules
  • Usage Rules

Voyons rapidement à quoi correspondent ces catégories.

Design rules : cette catégorie regroupe, comme son nom l'indique, les règles de design .Net. C'est-à-dire les manières de concevoir et de réaliser les différents objets, classes, membres... Cela reprend le contenu du ".NET Framework Design Guidelines" publié par Microsoft.

Globalization Rules : ce sont des règles avec l'application de la globalisation du code et des applications. En relation notamment avec la culture, la langue et les paramètres propres à une région.

Interoperability Rules : ce sont les règles qui vérifient les éléments du code relatif aux problèmes d'interaction avec les clients COM.

Mobility Rules : ces règles vont vérifier qu'il n'y a pas de risque d'activité excessive de l'application, entrainant une surconsommation électrique, comme par exemple des timers produisant une activité importante et continue, ou qu'une priorité de processus trop grande soit donnée à l'application.

Naming Rules : ce sont les règles chargées de vérifier le respect des conventions de nommage des différents éléments dans le code. Elles reprennent les conventions édictées dans le ".NET Framework Design Guidelines."

Performance Rules : règles vérifiant que le code est conçu de manière à ne pas avoir un impact potentiellement néfaste sur les performances de l'application.

Portability Rules : règles vérifiant la portabilité possible du code vers différentes plateformes.

Security Rules : règles vérifiant qu'il n'y a pas de problème majeur de sécurité au niveau de la conception du code.

Usage Rules : règles vérifiant que les usages dans le développement d'applications .Net sont respectés. Cela couvre des domaines relativement différents.

FxCop propose plus de 200 règles permettant de vérifier de nombreux points précis dans un code donné. Même si ces règles couvrent un champ large, nous allons voir qu'il est cependant possible de créer ses propres règles, et d'ajouter de nouveaux points de contrôles.

4. Ajouter de nouvelles règles personnalisées

FxCop offre la possibilité d'ajouter de nouvelle règles à valider, étendant ainsi quasiment sans limite les vérifications et validations à effectuer sur un code. Dès lors, il devient possible d'ajouter des règles totalement personnalisées, et, collant au plus près aux spécifications et contraintes d'une application. Voilà comment procéder.

Tout d'abord, il faut préciser que les règles sont contenues dans des dll .Net. Il nous faudra donc générer une nouvelle dll pour étendre le nombre de règles prisent en charge par FxCop.

Nous allons utiliser Visual Studio 2005 et le langage Visual Basic .Net pour créer une nouvelle règle, mais sachez que n'importe quel IDE ou même Notepad fera l'affaire, il s'agît juste de créer une dll .Net. Il faut donc choisir le type de projet "Bibliothèque de classe".

Sans plus tarder, il faut ajouter deux références à votre projet. Les références à ajouter concernent deux dll fournies avec FxCop, il s'agît de FxCopSdk.dll et Microsoft.Cci.dll qui se trouvent dans le répertoire d'installation de FxCop, par défaut "C:\Program Files\Microsoft FxCop 1.35"

Le principe est relativement simple, nous allons créer une classe BaseCustomRule qui dérive d'une classe du SDK, la classe BaseIntrospectionRule. Cette nouvelle classe nous servira de classe de base pour les règles que nous voulons ajouter. Cette classe que nous allons créer devra se trouver dans un namespace DeveloppezCustomRules, qui englobera par ailleurs l'ensemble des classes de notre projet. Nous allons aussi ajouter un constructeur qui permet de passer le nom de la règle concernée, une référence au fichier XML, ainsi qu'à l'assembly. Voilà à quoi doit ressembler votre classe de base.

Classe BaseCustomRule
Sélectionnez

Imports System
Imports System.Collections.Generic
Imports System.Text
Imports Microsoft.FxCop.Sdk
Imports Microsoft.FxCop.Sdk.Introspection

Namespace DeveloppezCustomRules

    <CLSCompliant(False)> _
    Public MustInherit Class BaseCustomRule
        Inherits BaseIntrospectionRule

        Public Sub New(ByVal ruleName As String)
            MyBase.New(ruleName, "DeveloppezCustomRules.Rules", GetType(BaseCustomRule).Assembly)
        End Sub

    End Class

End Namespace

Une fois cette classe de base créée, nous pouvons édicter nos règles personnalisées. Il va s'agir de classes dérivant de la classe de base. La première classe que je vais ajouter au projet se nomme DeveloppezRule1. Elle comporte les éléments suivants :

  • Un constructeur : il prend en paramètre le nom de la règle tel qu'il sera définit dans le fichier XML que nous allons voir plus loin.
  • Une méthode BeforeAnalysis() qui se substitue à celle de la classe BaseIntrospectionRule. Cette méthode contient le code qui sera exécuté avant de lancer l'analyse de l'assembly, c'est donc le bon endroit, par exemple, pour initialiser des variables ou effectuer je ne sais quelle action qui vous sera utile.
  • Une méthode Check(), elle substitue à la méthode Check de la classe BaseIntrospectionRule. Cette méthode est la plus importante, c'est elle qui contient le code de l'analyse à proprement parler. Cette fonction retourne une ProblemCollection, qui contiendra comme son nom l'indique, le ou les problèmes rencontrés.
  • Une méthode AfterAnalysis() qui se substitue à celle de la classe BaseIntrospectionRule. Cette méthode contient le code qui sera exécuté après la vérification de l'assembly par la méthode Check. Dans cette méthode vous pouvez envisager de libérer les ressources utilisées, ou encore, effectuer une quelconque action post-vérification en relation avec votre règle personnalisée.

Cette classe contenant notre règle personnalisée, doit bien évidemment faire partie du namespace DeveloppezCustomRules. Voici à quoi pourrait ressembler votre classe :

Classe DeveloppezRule1
Sélectionnez

Imports Microsoft.Cci
Imports Microsoft.FxCop.Sdk
Imports Microsoft.FxCop.Sdk.Introspection


Namespace DeveloppezCustomRules

    <CLSCompliant(False)> _
    Public Class DeveloppezRule1
        Inherits BaseCustomRule


        Public Sub New()
            MyBase.New("DeveloppezRule1")
        End Sub


        Public Overrides Sub BeforeAnalysis()
            ' Code exécuter avant la vérification par Check()

        End Sub


        Public Overrides Function Check(ByVal aMember As Microsoft.Cci.Member) As ProblemCollection

            If aMember Is Nothing Then
                Return Nothing
            End If

            If aMember.Name.ToString.StartsWith("FxCop") Then
                Problems.Add(New Problem(GetResolution(aMember.Name.ToString)))
            End If

            Return Problems

        End Function


        Public Overrides Sub AfterAnalysis()
            ' Code exécuter après la vérification par Check()

        End Sub

    End Class

End Namespace

A la lecture de ces quelques lignes de code je dois vous apporter quelques précisions, notamment à propos de la méthode check. Cette méthode propose six surcharges et donc peut prendre des types de paramètres différents. En voici la liste :

  • namespaceName As String, type As Microsoft.Cci.TypeNodeLists
  • module As Microsoft.Cci.Module
  • resource As Microsoft.Cci.Resource
  • type As Microsoft.Cci.TypeNode
  • member As Microsoft.Cci.Member
  • parameter As Microsoft.Cci.Parameter

Ici, elle prend en paramètres un membre de type Microsoft.Cci.Member, c'est le cas puisque notre règle va porter sur l'analyse des membres d'une classe. Son code, que j'ai recopié ci-dessous, nous montre que la vérification va porter le nom des membres de l'assembly, et la condition de "validation" va être que ce nom ne commence pas par "FxCop". Si jamais c'est le cas, alors on retourne le problème dans une ProblemCollection en utilisant la méthode Add, qui en paramètre prend un objet Problem. Cet objet Problem va lui, prendre en paramètre, la "solution", en effet nous allons pouvoir ici passer une liste de chaînes que l'on pourra retourner à l'utilisateur dans le rapport d'analyse. Vous comprendrez plus tard à quel point ce détail est pratique. Ici, je me contente de retourner le nom de la méthode; cela me permettra de l'afficher dans le détail du problème que FxCop aura détecté par le biais de notre règle personnalisée. Je me contente de retourner seulement le nom du membre concerné par le problème, mais je peux potentiellement faire passer n'importe quelle information, du moment qu'elle est de type System.String.

Fonction Check()
Sélectionnez

        Public Overrides Function Check(ByVal aMember As Microsoft.Cci.Member) As ProblemCollection

            If aMember Is Nothing Then
                Return Nothing
            End If

            If aMember.Name.ToString.StartsWith("FxCop") Then
                Problems.Add(New Problem(GetResolution(aMember.Name.ToString)))
            End If

            Return Problems

        End Function

Nous voyons ici que nous utilisons des tests relativement simples, à base de If / End If, mais, sachez qu'il est possible de faire des choses beaucoup plus complexes, et que l'analyse peut être très poussée, on le constate d'ailleurs avec les règles déjà existantes. Je tiens à attirer votre attention sur l'énumération "Microsoft.cci.NodeType" qui permet de déterminer quel élément il faut cibler dans l'assembly. Cette énumération est très pratique et vous l'utiliserez quasiment à chaque fois.

Nous venons de terminer le code de notre règle personnalisée, cependant il manque une partie importante de la règle, les métadonnées, qui elles, sont contenues dans un fichier XML. Ces informations sont en fait ce qui va permettre à FxCop de donner des indications au développeur analysant ses assemblies. Voici à quoi ressemble le contenu du fichier XML :

Fichier Rules.xml
Sélectionnez

<?xml version="1.0" encoding="utf-8" ?>
<Rules FriendlyName="Règles Developpez.com">
  <Rule TypeName="DeveloppezRule1" Category="Microsoft.Naming" CheckId="DVP001">
    <Name>DeveloppezRule1 : noms de membres commencant par "FxCop"</Name>
    <Description>Les noms de membres ne doivent pas commencer par "FxCop"</Description>
    <GroupOwner>Developpez.com</GroupOwner>
    <DevOwner>Webman</DevOwner>
    <Owner>Webman</Owner>
    <Url>http://webman.developpez.com</Url>
    <Resolution>Modifier le nom du membre "{0}" de manière à ce qu'il ne commence pas par "FxCop"</Resolution>
    <Email>mail@mail.com</Email>
    <MessageLevel Certainty="100">Warning</MessageLevel>
    <FixCategories>Breaking</FixCategories>
  </Rule>
</Rules>

Entrons un peu dans le détail :

  • TypeName : c'est le nom de la règle, celui que l'on passe au constructeur de la règle personnalisée. Il doit être unique.
  • Category : c'est la catégorie de la règle, ici elle correspond à la règle de nommage.
  • CheckID : est un identifiant unique de la règle.
  • Name : c'est le nom de la règle.
  • Description : comme son nom ne l'indique absolument pas... il s'agît de la description de la règle.
  • GroupOwner : on spécifie généralement ici le nom de la société.
  • Owner : le nom du développeur qui à créer cette règle.
  • Url : on spécifie ici une URL pointant vers une aide en ligne correspondant à l'erreur associée à la règle.
  • Resolution : c'est le message qui apparait dans le détail de l'anomalie détectée, il propose une solution. C'est dans ce message que l'on peut afficher les informations passées en paramètres à la méthode GetResolution(). Pour afficher ces informations, il suffit juste de mettre entre accolades {} l'index de la chaine dans la liste de paramètre. Attention, l'index commence à {0} et non à {1} ; de plus s'il l'on spécifie un index hors tableau une exception sera levée, il faut donc être attentif à ce que l'on fait.
  • Email : l'adresse mail du développeur ou de l'entreprise auteur de la règle.
  • MessageLevel : l'importance du problème détecté. Cela peut être une des six catégories suivantes : Error, Critical Error, Warning, Critical Warning, Information.
  • MessageLevel Certainty : le pourcentage de probabilité que l'anomalie détectée en soit réellement une, généralement on utilise un chiffre entre 1 et 99%, mais l'on peut également utiliser 100% si on le souhaite.
  • FixCategories : la valeur peut être Breaking, NonBreaking ou Unknown, cela signifie respectivement que si l'on applique la solution proposée, il faudra aussi recompiler les assemblies ayant des dépendances avec l'assembly comportant l'anomalie, sous peine d'être confronté à des erreurs d'exécution.
  • FriendlyName : ce nom ne concerne pas une règle en particulier, mais l'ensemble des règles contenues dans la dll, ce nom s'affiche dans l'interface de FxCop, dans la liste des dll des règles chargées.

Remarque : le fichier XML devra être intégré dans la dll, cela signifie que "Actions de génération" devra être positionné sur "Ressource incorporée", et que "Copier dans le répertoire de sortie" devra être positionné à "Ne pas copier".

A ce stade, vous n'avez plus qu'à générer votre projet. La dll est alors créée, il vous faut aller dans FxCop, puis dans le menu "Project", "Add Rules" et sélectionner la dll fraichement générée. Vos nouvelles règles apparaissent alors dans la liste, et vous pouvez activer ou non vos règles en globalité, ou alors règle par règle.

Règles personnalisées chargées dans FxCop



Pour que vous compreniez mieux le processus de création de règles personnalisées, voici, deux autres règles personnalisées, comme pour la première, elles se trouvent dans le même namespace, et dérivent de la classe de base que nous avons créé au début de cet article.

La règle suivante a pour but de vérifier que les noms de namespaces contenus dans l'assembly commencent bien par "Dvp". Voici la classe DeveloppezRule2 :

Classe DeveloppezRule2
Sélectionnez

Imports Microsoft.Cci
Imports Microsoft.FxCop.Sdk
Imports Microsoft.FxCop.Sdk.Introspection


Namespace DeveloppezCustomRules

    <CLSCompliant(False)> _
    Public Class DeveloppezRule2
        Inherits BaseCustomRule


        Public Sub New()
            MyBase.New("DeveloppezRule2")
        End Sub


        Public Overrides Sub BeforeAnalysis()
            ' Code exécuté avant la vérification par Check()
        End Sub


        ' Détecte que le Namespace commence bien par "Dvp"
        Public Overrides Function Check(ByVal namespaceName As String, ByVal types As Microsoft.Cci.TypeNodeList) _ 
						 As ProblemCollection

            If Not namespaceName.StartsWith("Dvp") Then
                Problems.Add(New Problem(GetResolution(namespaceName, namespaceName.Substring(0, 3))))
            End If

            Return Problems

        End Function



        Public Overrides Sub AfterAnalysis()
            ' Code exécuté après la vérification par Check()
        End Sub

    End Class

End Namespace

La troisième règle personnalisée de ce tutoriel, vérifie que le nom des Public Sub(), n'étant pas des événements, est composé d'au mois 7 caractères. Voici le code de la classe DeveloppezRule3 :

Classe DeveloppezRule3
Sélectionnez

Imports Microsoft.Cci
Imports Microsoft.FxCop.Sdk
Imports Microsoft.FxCop.Sdk.Introspection



Namespace DeveloppezCustomRules

    <CLSCompliant(False)> _
    Public Class DeveloppezRule3
        Inherits BaseCustomRule


        Public Sub New()
            MyBase.New("DeveloppezRule3")
        End Sub

        Public Overrides Sub BeforeAnalysis()
            ' Code exécuté avant la vérification

        End Sub

        ' Détecte que le Namespace commence bien par "Dvp"
        Public Overrides Function Check(ByVal member As Microsoft.Cci.Member) As ProblemCollection

            If member.Name Is Nothing Then
                Return Nothing
            End If

            If member.IsPublic And NodeType.Sub And Not NodeType.Event And member.Name.ToString.Length < 7 Then
                Problems.Add(New Problem(GetResolution(member.Name.ToString)))
            End If

            Return Problems

        End Function

        Public Overrides Sub AfterAnalysis()
            ' Code exécuter après la vérification

        End Sub

    End Class

End Namespace

Et enfin, pour que cela soit complet, voici le fichier XML contenant les trois règles personnalisées. Vous remarquerez que les TypeName et CheckID sont uniques au sein du fichier XML, cela est obligatoire.

Fichier Rules.xml complet
Sélectionnez

<?xml version="1.0" encoding="utf-8" ?>
<Rules FriendlyName="Règles Developpez.com">
  <Rule TypeName="DeveloppezRule1" Category="Microsoft.Naming" CheckId="DVP001">
    <Name>DeveloppezRule1 : noms de membres commencant par "FxCop"</Name>
    <Description>Les noms de membres ne doivent pas commencer par "FxCop"</Description>
    <GroupOwner>Developpez.com</GroupOwner>
    <DevOwner>Webman</DevOwner>
    <Owner>Webman</Owner>
    <Url>http://webman.developpez.com</Url>
    <Resolution>Modifier le nom du membre "{0}" de manière à ce qu'il ne commence pas par "FxCop"</Resolution>
    <Email>mail@mail.com</Email>
    <MessageLevel Certainty="100">Warning</MessageLevel>
    <FixCategories>Breaking</FixCategories>
  </Rule>
  
  <Rule TypeName="DeveloppezRule2" Category="Microsoft.Naming" CheckId="DVP002">
    <Name>DeveloppezRule2 : nom de namespace ne commancant pas par "Dvp"</Name>
    <Description>Les noms de namespace doivent commencer par "Dvp"</Description>
    <GroupOwner>Developpez.com</GroupOwner>
    <DevOwner>Webman</DevOwner>
    <Owner>Webman</Owner>
    <Url>http://webman.developpez.com</Url>
    <Resolution>
		Modifier le namespace "{0}" de manière à ce qu'il commence par "Dvp", actuellement il commence par "{1}".
	</Resolution>
    <Email>mail@mail.com</Email>
    <MessageLevel Certainty="100">Error</MessageLevel>
    <FixCategories>Breaking</FixCategories>
  </Rule>

  <Rule TypeName="DeveloppezRule3" Category="Microsoft.Naming" CheckId="DVP003">
    <Name>DeveloppezRule3 : nom de Public Sub() trop court</Name>
    <Description>Les noms de Public Sub() doivent contenir au moins 7 caractères.</Description>
    <GroupOwner>Developpez.com</GroupOwner>
    <DevOwner>Webman</DevOwner>
    <Owner>Webman</Owner>
    <Url>http://webman.developpez.com</Url>
	<Resolution>
		Modifier le Public Sub() "{0}" de manière à ce que son nom contienne au moins 7 caractères.
	</Resolution>
    <Email>mail@mail.com</Email>
    <MessageLevel Certainty="100">Warning</MessageLevel>
    <FixCategories>Breaking</FixCategories>
  </Rule>
  
</Rules>

J'espère qu'au travers de cette partie vous aurez vu à quel point créer des règles personnalisée est chose aisé, et peut être pratique. Je me suis borné ici à donner des exemples relativement simples, pour ne pas masquer l'objectif de cette démonstration, mais, sachez que l'on peut faire des analyses de code très poussées et complexes.

5. Intégrer FxCop dans Visual Studio 2005

FxCop est un outil autonome, et indépendant de Visual Studio 2005 (sauf dans les versions Team System et Team Suite pour lesquelles il est directement intégré dans l'IDE) mais il pourrait être intéressant de l'intégrer en tant "qu'outil externe". Cela est tout à fait réalisable, voici comment procéder.

  • Aller dans menu "Outils", "Outils externes", bouton "Ajouter".
  • Dans le titre, entrez par exemple "FxCop 1.35"
  • Dans commande : entrez le chemin pointant vers l'exécutable "FxCopCmd.exe" qui se trouve dans le répertoire d'installation de FxCop, sur ma machine, le chemin complet est "C:\Program Files\Microsoft FxCop 1.35\FxCopCmd.exe".
  • Dans arguments : entrez la ligne suivante, adaptée si besoin au chemin du répertoire " Rules " si le vôtre est différent. "/f:$(TargetPath) /r:"C:\Program Files\Microsoft FxCop 1.35\Rules" /c"
  • Dans répertoire initial, entrez "$(ProjectDir)"
  • Cochez "Utiliser la fenêtre de sortie", ainsi le résultat de l'analyse s'affichera dans cette même fenêtre.

Voici à quoi devrait ressembler la fenêtre de configuration des outils externes :

Intégration de FxCop dans Visual Studio 2005



Maintenant vous devez fermer et ré-ouvrir Visual Studio 2005. L'avantage ici, est que FxCop est directement intégré dans l'IDE, et accessible depuis le menu "Outil", mais personnellement je n'aime pas cette intégration, car afficher le rapport dans la fenêtre de sortie n'est pas très exploitable... En tout cas, bien loin de l'ergonomie de l'interface de FxCop. C'est donc pratique de pouvoir accéder à FxCop de cette manière, mais cela ne dispensera pas d'utiliser FxCop en tant qu'application indépendante.

Ressources

Conclusion

Au cours de cet article nous avons vu que FxCop est un outil d'analyse de code très complet, possédant plus de 200 règles, ce qui couvre un domaine vaste. Si vous suivez les recommandations, vous êtes à peu près certain d'avoir un code conforme aux bonnes pratiques .Net, et vous éviterez les problèmes de sécurité majeurs. Mais, un tel outil ne pouvant pas être exhaustif, nous avons vu en contre-partie qu'il est relativement aisé de créer ses propres règles personnalisées d'analyse grâce à un SDK, qui présente malheureusement l'énorme inconvénient de ne pas être documenté, espérons que ce point évoluera rapidement. En effet, ces fonctionnalités sont très intéressantes et mérient que l'on s'y intéresse. J'espère, au travers de cet article, avoir réussi à vous montrer l'utilité réelle, et le gain de productivité que peut vous apporter FxCop, et que désormais, cet outil fera partie des applications que vous utiliserez au quotidien.

Un grand merci à Khany pour la relecture de cet article, ainsi qu'à l'équipe .Net pour son aide.