Comment : générer des graphiques de dépendance pour le code .NET

Pour explorer l'organisation et les relations du code .NET, utilisez Visual Studio Ultimate pour générer des graphiques de dépendance. Utilisez ces graphiques pour visualiser, explorer et analyser les dépendances du code. Un graphique représente des éléments de code et leurs relations sous la forme d'un ensemble de nœuds connectés par des liens (ou bords).

Notes

Si votre solution est volumineuse, la génération d'un graphique de dépendance peut provoquer une exception de mémoire insuffisante. Si cela se produit, réduisez la portée de votre solution. Vous pouvez également utiliser le navigateur de l'architecture pour sélectionner les projets et dépendances que vous souhaitez visualiser, puis en générer le graphique.

Pour générer des graphiques de dépendance pour du code C et C++ et des projets Web, téléchargez et installez le Pack de fonctionnalités de visualisation et de modélisation Microsoft Visual Studio 2010.

Pour plus d'informations, consultez :

Choisir un graphique de dépendance à générer

Visual Studio Ultimate vous permet de générer rapidement des documents de graphiques afin d'explorer les dépendances du code. Pour générer des documents de graphiques à l'aide d'un outil en ligne de commande, consultez Générer des documents de graphiques en vue d'un traitement par lots.

Pour

Générer un graphique qui affiche des relations

Afficher une vue d'ensemble du code source

Entre tous les assemblys, tous les espaces de noms ou toutes les classes dans une solution Visual Studio.

Le graphique affiche des dépendances globales pour le niveau supérieur de nœuds que vous avez sélectionné.

Afficher des dépendances spécifiques au sein du code source

Entre des zones de code source sélectionnées dans une solution Visual Studio.

Utilisez le Navigateur de l'architecture pour parcourir le code de façon hiérarchique et sélectionner des genres spécifiques de structures et de relations.

Afficher une vue d'ensemble du code compilé

Dans un ou plusieurs fichiers d'assembly (.dll) .NET ou exécutables (.exe)

Afficher des dépendances spécifiques au sein du code compilé

Entre les zones sélectionnées de fichiers exécutables (.exe) ou d'assemblys (.dll) .NET.

Utilisez le Navigateur de l'architecture pour parcourir et sélectionner des genres spécifiques de structures et de relations.

Après avoir généré le graphique, vous pouvez l'utiliser pour explorer le code de différentes façons. Pour plus d'informations, consultez Comment : explorer du code avec des graphiques de dépendance.

Afficher une vue d'ensemble du code source dans une solution Visual Studio

  1. Ouvrez la solution.

  2. Dans le menu Architecture, pointez sur Générer un graphique de dépendance, puis effectuez l'une des opérations suivantes :

    Cliquez sur

    Pour générer un graphique qui affiche

    Par assembly

    Les dépendances globales entre tous les assemblys produits par votre solution et toutes leurs dépendances externes.

    Pour afficher les espaces de noms, les classes et les méthodes figurant dans un assembly et développer cet assembly sur le graphique. Les assemblys externes affichent uniquement les éléments en cours d'utilisation.

    Par espace de noms

    Les dépendances globales entre tous les espaces de noms de votre solution et tous les espaces de noms externes dont dépend le code.

    Pour afficher les classes et les méthodes figurant dans un espace de noms et développer cet espace de noms sur le graphique. Les espaces de noms externes affichent uniquement les éléments en cours d'utilisation.

    Par classe

    Les dépendances globales entre toutes les classes de votre solution. Aucune information relative aux classes externes utilisées par le code ne s'affiche.

    ou

    Pour afficher les dépendances entre plusieurs types de structures, cliquez sur Personnalisé.

    1. Dans la boîte de dialogue Générer un graphique de dépendance, cliquez au moins sur l'une des cases suivantes : Assemblys, Espaces de noms, Types ou Méthodes.

    2. Reportez-vous au tableau suivant pour filtrer le graphique :

      Pour

      Exécuter ces étapes

      Afficher les références aux dépendances externes.

      Cette opération est utile pour étudier dans quelle mesure les assemblys internes reposent sur les assemblys externes.

      Sélectionnez Externes

      Afficher uniquement les types et méthodes ayant des niveaux d'accès spécifiques.

      Par exemple, vous pouvez simplifier le graphique en sélectionnant uniquement des types publics.

      Développez le volet Filtre d'accès, puis sélectionnez les niveaux voulus.

      RemarqueRemarque
      Vous devez sélectionner au moins un niveau d'accès de type.Pour réduire le nombre de dépendances sur le graphique, sélectionnez uniquement les niveaux d'accès que vous voulez pour les méthodes.

      Afficher les dépendances de niveau supérieur en faisant apparaître les relations contenant-contenu sous forme de groupes imbriqués et les dépendances sous forme de liens globaux.

      RemarqueRemarque
      Pour les méthodes, les dépendances s'afficheront sous forme de liens individuels, et non pas de liens globaux car les méthodes sont les nœuds terminaux de plus bas niveau.

      Activez la case Afficher la relation contenant-contenu en tant que groupe.

      Afficher les dépendances de bas niveau en faisant apparaître les relations contenant-contenu sous forme de nœuds liés et les dépendances sous forme de liens individuels.

      Désactivez la case Afficher la relation contenant-contenu en tant que groupe.

    3. Lorsque vous avez terminé, cliquez sur OK.

      Visual Studio crée un document de graphique orienté (fichier .dgml) et l'ouvre.

    L'épaisseur du lien d'une dépendance globale indique approximativement le nombre de dépendances individuelles qu'elle représente. Pour afficher les genres de dépendances représentés par le lien, placez le pointeur sur le lien de façon à afficher l'info-bulle.

    Notes

    Les graphiques de dépendance que vous générez à partir du menu Architecture n'affichent pas d'appels aux méthodes virtuelles jusqu'au type le plus dérivé. Au lieu de cela, ils affichent des dépendances sur les types qui déclarent ces membres virtuels. Vous pouvez toutefois utiliser l'option Affichage de classes dans le Navigateur de l'architecture pour rechercher ces appels. Vous pouvez ensuite les faire glisser du Navigateur de l'architecture vers un graphique existant ou vous pouvez générer un nouveau graphique à partir de la barre d'outils Navigateur de l'architecture.

Afficher des dépendances spécifiques du code source dans une solution Visual Studio

Utilisez le Navigateur de l'architecture pour rechercher le code et les relations que vous souhaitez visualiser. Vous pouvez également utiliser des requêtes prédéfinies pour générer un graphique.

  1. Ouvrez la solution.

  2. Si le Navigateur de l'architecture n'est pas ouvert, dans le menu Architecture, pointez sur Fenêtres, puis cliquez sur Navigateur de l'architecture.

  3. Dans la première colonne du Navigateur de l'architecture, sous Visual Studio, cliquez sur l'une des vues suivantes :

    • Affichage de classes pour explorer la hiérarchie logique du code.

      Utilisez cette vue pour parcourir les espaces de noms, les types, les méthodes, etc.

    • Affichage de solutions pour explorer la hiérarchie physique du code

      Utilisez cette vue pour parcourir les projets, les fichiers sources, etc.

  4. Dans la colonne suivante, sélectionnez les éléments que vous voulez explorer. Pour sélectionner tous les éléments de la colonne, appuyez sur CTRL+A.

    La colonne suivante affiche les éléments liés à votre sélection en fonction des genres par défaut d'éléments et de relations de cette colonne.

    Notes

    Pour sélectionner d'autres genres d'éléments et de relations, développez la colonne réduite qui est située à droite de la colonne comportant vos sélections. Sous Navigation des nœuds, sélectionnez les genres d'éléments voulus. Sous Navigation sortante ou Navigation entrante, sélectionnez les genres de relations voulus. Pour plus d'informations, consultez Comment : rechercher du code à l'aide du navigateur de l'architecture.

  5. Répétez l'étape 4 jusqu'à ce que vous ayez sélectionné tous les éléments voulus.

    Notes

    Pour inclure les dépendances Appels dans votre graphique, recherchez et sélectionnez toutes les méthodes appelées par les classes sélectionnées.

  6. Pour créer un graphique à partir de votre sélection, sous la barre de titre du Navigateur de l'architecture, cliquez sur Créer un document de graphique à partir de tous les nœuds sélectionnés.

    Visual Studio crée un document de graphique orienté (fichier .dgml) et l'ouvre.

    ou

    Pour ajouter votre sélection à un graphique existant ou à un graphique vide, procédez comme suit :

    1. Ouvrez le fichier .dgml du graphique existant ou créez un graphique vide.

    2. Sous la barre de titre du Navigateur de l'architecture, cliquez sur Ajouter tous les nœuds sélectionnés au document de graphique visible actuellement.

      ou

      Faites glisser les nœuds à partir du Navigateur de l'architecture vers le graphique.

Création d'un graphique vide

  1. Pour ouvrir un graphique vide, dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Fichier.

    ou

    Pour ajouter un graphique vide au dossier Éléments de solution, dans l'Explorateur de solutions, cliquez avec le bouton droit sur le nœud de solution de niveau supérieur, puis cliquez sur Ajouter un nouvel élément.

  2. Sous Modèles installés, cliquez sur Général.

  3. Dans le volet droit, cliquez sur Document de graphique orienté, attribuez un nom au graphique, puis cliquez sur Ajouter.

Pour plus d'informations sur les différentes façons d'interagir avec le graphique, cliquez sur le lien d'aide qui s'affiche sur le graphique vide.

Explorer le code source à l'aide de requêtes prédéfinies

  1. Ouvrez la solution.

  2. Si le Navigateur de l'architecture n'est pas ouvert, dans le menu Architecture, pointez sur Fenêtres, puis cliquez sur Navigateur de l'architecture.

  3. Dans la première colonne du Navigateur de l'architecture, sous Requêtes DGQL enregistrées, cliquez sur Dans des dossiers.

  4. Dans la colonne suivante, cliquez sur l'une des requêtes suivantes, selon le genre de graphique que vous voulez créer :

    Pour générer un graphique qui affiche

    Cliquez sur

    Tous les assemblys référencés par la solution.

    À partir des résultats de la requête, vous pouvez générer un graphique qui affiche les dépendances entre ces assemblys.

    All Assembly References.dgql

    Une liste plate de tous les assemblys de sortie de la solution sans liens de dépendance.

    All Output Assemblies.dgql

    Pour générer un graphique de dépendance standard pour les assemblys sélectionnés, procédez comme suit :

    1. Dans la colonne suivante, sélectionnez les assemblys voulus.

    2. Le long du côté droit de la colonne active, cliquez sur la colonne d'action réduite pour la développer.

      RemarqueRemarque
      La colonne d'action apparaît en surbrillance lorsque vous placez le pointeur dessus.
    3. Dans la colonne d'action, sous Commandes, cliquez sur Graphique standard.

    Tous les projets de la solution.

    À partir des résultats de la requête, vous pouvez générer un graphique qui présente les références entre ces projets.

    All Project References.dgql

    Une liste plate de tous les projets de la solution.

    Si votre solution inclut des dossiers de solution, cette liste diffère de celle qui s'affiche lorsque vous cliquez sur Affichage de solutions dans le navigateur de l'architecture.

    All Projects.dgql

    Tous les types de la solution.

    À partir des résultats de la requête, vous pouvez générer un graphique qui présente les relations d'héritage entre ces types.

    Inheritance Graph.dgql

    La colonne suivante affiche les résultats sous forme de liste plate. Même si des liens peuvent exister entre ces nœuds, le Navigateur de l'architecture ne les affichera pas.

  5. Pour générer un graphique, y compris les liens, pour tous les éléments de la colonne de résultats, procédez comme suit :

    1. Dans la colonne de résultats, appuyez sur CTRL+A pour sélectionner tous les éléments.

    2. Appuyez sur la touche CTRL et maintenez-la enfoncée pour inclure uniquement les éléments de la colonne actuelle dans le graphique, puis sous la barre de titre du Navigateur de l'architecture, cliquez sur Créer un document de graphique à partir de tous les nœuds sélectionnés.

      Visual Studio crée un document de graphique orienté (fichier .dgml) et l'ouvre.

Afficher une vue d'ensemble du code compilé

  1. Créez un graphique vide ou ouvrez le fichier .dgml d'un graphique existant.

  2. Hors de Visual Studio, faites glisser le fichier .dll ou .exe vers le graphique.

    Notes

    L'opération de glissement à partir du dossier Références de l'Explorateur de solutions n'est pas prise en charge. Vous pouvez faire glisser des assemblys à partir de l'Explorateur Windows uniquement si vous exécutez ce dernier et Visual Studio avec le même niveau d'autorisations de contrôle d'accès d'utilisateur. Par exemple, si le contrôle d'accès d'utilisateur est activé et que vous exécutez Visual Studio en tant qu'administrateur, l'Explorateur Windows bloquera l'opération de glissement. Pour résoudre ce problème, désactivez le contrôle d'accès d'utilisateur ou utilisez les requêtes prédéfinies pour explorer votre solution.

Afficher des dépendances spécifiques dans le code compilé

  1. Si le Navigateur de l'architecture n'est pas ouvert, dans le menu Architecture, pointez sur Fenêtres, puis cliquez sur Navigateur de l'architecture.

  2. Dans la première colonne, sous Système de fichiers, cliquez sur Sélectionner les fichiers.

  3. Dans la zone Ouvrir, recherchez les fichiers .dll ou .exe pour les sélectionner et les ouvrir.

  4. Dans la colonne suivante, sélectionnez les assemblys. Pour sélectionner tous les éléments de la colonne, appuyez sur CTRL+A.

    La colonne suivante affiche les éléments liés à votre sélection en fonction des genres par défaut d'éléments et de relations de cette colonne.

    Notes

    Pour sélectionner d'autres genres d'éléments et de relations, développez la colonne réduite qui est située à droite de la colonne comportant vos sélections. La colonne d'action apparaît en surbrillance lorsque vous placez le pointeur dessus. Sous Navigation des nœuds, sélectionnez les genres d'éléments voulus. Sous Navigation sortante ou Navigation entrante, sélectionnez les genres de relations voulus. Pour plus d'informations, consultez Comment : rechercher du code à l'aide du navigateur de l'architecture.

  5. Choisissez l'une des valeurs suivantes :

    Pour créer un graphique de dépendance à partir des éléments suivants

    Procédez comme suit

    Assemblys

    1. À droite de la colonne qui contient les assemblys, cliquez sur la colonne d'action réduite pour la développer.

      La colonne d'action apparaît en surbrillance lorsque vous placez le pointeur dessus.

    2. Dans la colonne d'action, sous Commandes, cliquez sur Graphique standard.

    Classes et méthodes

    1. Parcourez les classes et méthodes en sélectionnant tous les éléments que vous voulez inclure dans le graphique.

    2. Pour créer un graphique, sous la barre de titre du Navigateur de l'architecture, cliquez sur Créer un document de graphique à partir de tous les nœuds sélectionnés.

      Visual Studio crée un document de graphique orienté (fichier .dgml) et l'ouvre.

      ou

      Pour ajouter votre sélection à un graphique existant ou à un graphique vide, procédez comme suit :

      1. Ouvrez le fichier .dgml du graphique existant ou créez un graphique vide.

      2. Sous la barre de titre du Navigateur de l'architecture, cliquez sur Ajouter tous les nœuds sélectionnés au document de graphique visible actuellement.

        ou

        Faites glisser les nœuds à partir du Navigateur de l'architecture vers le graphique.

Générer des documents de graphiques en vue d'un traitement par lots

Pour générer des documents de graphique (fichiers .dgml) en mode batch, utilisez l'outil en ligne de commande GraphCmd.exe. Par exemple, vous pouvez rechercher les dépendances qui ont changé d'une build à une autre en exécutant l'outil après chaque build.

Cet outil se trouve dans le dossier suivant : C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE.

Notes

GraphCmd.exe ne génère des informations sur les dépendances que pour les assemblys ou les fichiers .dgml, et non pour le code source figurant dans une solution Visual Studio ou des fichiers projet.

La syntaxe de GraphCmd.exe est la suivante :

GraphCmd -? -all -exceptions -input File_Name -query File_Name -exec

"DGQL_Statement" -output File_Name -path alias=path

Le tableau suivant décrit les options de GraphCmd.exe :

-?

Afficher l'aide de GraphCmd.exe.

-all

Inclure tous les résultats de requête intermédiaires, et pas seulement ceux du dernier ensemble de nœuds.

-exceptions

Signaler les exceptions de requête sous la forme d'un fichier de document de graphique (.dgml).

-input Nom_Fichier

Traiter le fichier .dgml spécifié.

Cela s'avère utile lorsque vous post-traitez et filtrez un gros fichier .dgml, car vous pouvez le visualiser plus facilement dans Visual Studio.

-query Nom_Fichier

Exécuter le fichier .dgql (DGQL, Directed Graph Query Language) spécifié.

Pour plus d'informations, consultez :

-exec "Instruction_DGQL"

Exécuter l'instruction DGQL spécifiée.

Pour plus d'informations, consultez Fonctionnement du langage DGQL (Directed Graph Query Language).

-output Nom_Fichier

Obtenir la sortie du fichier .dgml spécifié.

-path alias=chemin d'accès

Spécifier un nouvel alias à utiliser dans l'entrée et la sortie de documents DGML.

Par exemple :

GraphCmd -output MyGeneratedGraph.dgml -path "MyPathAlias=C:\Program Files\..."

Pour plus d'informations, consultez Alias pour les chemins d'accès fréquemment utilisés.

Notes

Comme GraphCmd.exe s'exécute en dehors de Visual Studio, la prise en charge des actions dans les requêtes .dgql est limitée.

Vous pouvez spécifier les options suivantes plusieurs fois : -input, -query, -exec et -path.

Alias pour les chemins d'accès fréquemment utilisés

Les alias pour les chemins d'accès fréquemment utilisés réduisent la taille du fichier .dgml, ainsi que la durée nécessaire au téléchargement et à l'enregistrement du fichier. Pour créer un alias, ajoutez une section <Paths></Paths> à la fin du fichier .dgml. Dans cette section, ajoutez un élément <Path/> pour définir un alias pour le chemin d'accès :

<Paths>
   <Path Id="MyPathAlias" Value="C:\...\..." />
</Paths>

Pour référencer l'alias à partir d'un élément du fichier .dgml, mettez l'Id de l'élément <Path/> entre parenthèses (()) et faites précéder le tout du signe dollar ($) :

<Nodes>
   <Node Id="MyNode" Reference="$(MyPathAlias)MyDocument.txt" />
</Nodes>
<Properties>
   <Property Id="Reference" Label="My Document" DataType="System.String" IsReference="True" />
</Properties>

Pour plus d'informations sur la modification de fichiers dgml, consultez Comment : modifier et personnaliser des documents de graphique.

Fonctionnement du langage DGQL (Directed Graph Query Language)

Le langage DGQL est un langage de requêtes simplifié que vous pouvez utiliser pour générer du code DGML. Une instruction DGQL suit un modèle alternant une sélection de nœuds et des actions, de sorte que chaque sélection de nœuds crée l'entrée de l'action suivante, dont la sortie devient l'entrée de la sélection de nœuds suivante, et ainsi de suite.

Le format d'une instruction DGQL est le suivant :

<node selection> / <action> / <node selection> / <action> / ...

Le tableau suivant décrit la syntaxe DGQL utilisée pour sélectionner des nœuds :

*

Sélectionner tous les nœuds.

+ "text"

Sélectionner tous les nœuds qui contiennent la chaîne "text".

+ Id.Equals("text")

Sélectionner tous les nœuds pour lesquels Id est égal à la chaîne "text".

+ Background.Contains("text")

Sélectionner tous les nœuds pour lesquels l'attribut Background a une valeur qui contient la chaîne "text".

+ "text1" + "text2" + ...

Sélectionner tous les nœuds qui correspondent à "text1" ou "text2".

+ MyProperty="True"

Sélectionner tous les nœuds qui possèdent une propriété nommée MyProperty ayant la valeur "True".

- Label.Contains("text")

Sélectionner tous les nœuds, sauf ceux qui possèdent un attribut Label qui contient (Contains) la chaîne "text".

+ Category.Is("MyCategory")

Sélectionner tous les nœuds qui possèdent une catégorie nommée MyCategory ou qui héritent de MyCategory.

Les actions sont proposées par les fournisseurs de données DGML qui sont enregistrés dans Visual Studio, mais vous pouvez découvrir ces actions en enregistrant une requête créée dans le Navigateur de l'architecture. Pour plus d'informations sur l'utilisation du Navigateur de l'architecture, consultez Comment : rechercher du code à l'aide du navigateur de l'architecture.

Le tableau suivant décrit des exemples d'actions directes pouvant être exécutées sur les nœuds sélectionnés :

Exemple d'action

Description

Microsoft.Contains

Retourner tous les nœuds qui sont contenus par les nœuds d'entrée. Vous pouvez remplacer Contains par une autre catégorie de lien.

Microsoft.Open

Ouvrir le code source des nœuds d'entrée.

RemarqueRemarque
Fonctionne uniquement dans Visual Studio.

Microsoft.AllOutBoundLinks

Retourner tous les nœuds qui sont la cible d'un lien sortant à partir des nœuds d'entrée.

Microsoft.AllInboundLinks

Retourner tous les nœuds qui sont l'extrémité source d'un lien vers les nœuds d'entrée.

Microsoft.Core.CreateGroupsByProperties

Appeler l'action GroupByProperties.

Microsoft.AllNodes

Retourner tous les nœuds figurant jusqu'ici dans l'ensemble du graphique.

Les actions pilotées par des données sélectionnent des éléments qui reposent uniquement sur les données figurant dans les nœuds d'entrée et les liens. Lorsque des catégories sont mises en correspondance grâce aux actions pilotées par des données, les catégories héritées sont incluses. Le tableau suivant décrit des exemples d'actions pilotées par des données :

Type

Description

Node:Both:Category

Retourner tous les nœuds qui possèdent la catégorie Category et qui sont reliés aux nœuds d'entrée par un lien qui pointe vers l'une ou l'autre direction.

Link:Both:Category

Retourner tous les nœuds qui sont reliés aux nœuds d'entrée par un lien qui pointe vers l'une ou l'autre direction et qui possèdent la catégorie Category.

Link:Backward:Category

Retourner tous les nœuds qui pointent vers les nœuds d'entrée ayant un lien qui possède la catégorie Category.

Link:Forward:Category

Retourner tous les nœuds qui pointent à partir des nœuds d'entrée ayant un lien qui possède la catégorie Category.

Conseils

  • En général, une action « par défaut » est définie pour un ensemble donné de nœuds d'entrée ; celle-ci est automatiquement sélectionnée par le Navigateur de l'architecture. Pour obtenir le même comportement, utilisez une action vide : //

  • Comme l'espace blanc n'est pas significatif en langage DGQL, vous pouvez mettre en forme votre requête de telle sorte qu'elle tienne sur une seule ligne si nécessaire. Cela s'avère utile lorsque vous utilisez l'option –exec avec GraphCmd.

  • Lorsque vous déboguez du code DGQL, utilisez l'action "Execute Expanded" dans le Navigateur de l'architecture pour afficher chaque étape de la requête et repérer l'étape qui ne produit pas les résultats attendus.

Exemple

L'instruction DGQL suivante exécute une requête décrite dans les étapes ci-dessous :

+ Id.Equals("Microsoft.Solution.ClassView") / "Microsoft.Solution.ClassView" / * / "Node:Both:CodeSchema_Class" / + CodeSchemaProperty_IsPublic.Equals("True")
  1. Commencez par sélectionner le nœud Affichage de classes dans la première colonne du Navigateur de l'architecture.

  2. Exécutez l'action "Microsoft.Solution.ClassView", de manière à retourner tous les espaces de noms de la solution. 

  3. Utilisez * pour sélectionner tous les espaces de noms.

  4. Sélectionnez tous les nœuds de catégorie CodeSchema_Class, associés à ces espaces de noms par un lien dans un sens ou dans l'autre. Ce seront généralement des liens de relation contenant-contenu.

  5. Filtrez les classes résultantes pour ne conserver que celles qui possèdent la propriété CodeSchemaProperty_IsPublic="True".

L'action "Microsoft.Solution.ClassView" est techniquement inutile, car il s'agit de l'action « par défaut » du nœud Affichage de classes. Vous pouvez par conséquent remplacer cette action par // pour simplifier la requête et la mettre en forme sur une seule ligne de la manière suivante :

+Id.Equals("Microsoft.Solution.ClassView")//*/"Node:Both:CodeSchema_Class"/+CodeSchemaProperty_IsPublic.Equals("True")

Voir aussi

Tâches

Comment : enregistrer, partager et exporter des documents de graphique

Concepts

Visualisation du code existant

Autres ressources

Comment : explorer du code avec des graphiques de dépendance

Comment : parcourir des documents de graphique et y accéder

Comment : modifier et personnaliser des documents de graphique