Partager via


Persistance d'informations dans des projets et des solutions

Les macros complémentaires Visual Studio sont déconseillées dans Visual Studio 2013. Vous devriez mettre vos macros complémentaires à niveau vers des extensions VSPackage. Pour plus d'informations sur les mises à jour, consultez FAQ : conversion de compléments en extensions VSPackage.

Lorsque vous fermez un projet, les données utilisateur telles que les valeurs de variables sont abandonnées, même si vous enregistrez la solution ou le projet. Toutefois, le modèle Automation de Visual Studio propose un moyen de stocker (ou conserver) ces données utilisateur entre les sessions de l'environnement de développement intégré (IDE). Cette opération est accomplie en utilisant l'objet Globals via les propriétés Globals et Globals. Globals  rend des variables de solution persistantes et Globals  rend des variables de projet persistantes. Chaque propriété retourne un objet Globals dont les membres vous permettent de stocker, de récupérer, d'énumérer et, le cas échéant, de rendre les données persistantes. Une fois cette opération effectuée, les valeurs sont restaurées lors de l'ouverture de la solution ou de projet suivante.

Cela s'avère utile, par exemple, pour permettre à une commande de proposer une valeur par défaut persistante, ou pour lui permettre de changer son comportement après avoir été appelée un nombre de fois particulier. Les compléments peuvent également utiliser cette fonctionnalité pour faire persister des données dans des fichiers solution (.sln) ou pour les récupérer.

Détails sur le comportement des objets globaux

Si l'objet Globals est associé à l'interface IDE, la valeur est rendue persistante à un des deux emplacements spécifiés ci-après. Pour Windows NT 4.0, Windows 2000 Professionnel et Windows Server 2003, les valeurs sont stockées sous C:\winnt\Profiles\<username>\Application Data\Microsoft\Visual Studio\extglobal.dat. Pour Windows 95, Windows 98, Windows 98 Deuxième Édition, Windows Millennium Edition, si l'ordinateur est configuré pour une connexion utilisateur, les valeurs sont stockées sous C:\Windows\Profiles\<username>\Application Data\Microsoft\Visual Studio\extglobal.dat. Sinon, il n'y a pas d'élément <username>. À chaque fermeture de l'interface IDE ou chaque fois qu'une opération Enregistrer tout se produit, l'interface IDE rend les valeurs globales persistantes.

Si l'objet Globals est associé à l'objet Solution2, la valeur persiste dans le fichier .sln. Ces valeurs persistent lors de l'enregistrement du fichier solution.

Si l'objet Globals est associé à un objet Project, la valeur persiste dans le fichier projet (.dsp, .vbp, etc.). Ces valeurs persistent à chaque enregistrement d'un projet.

Les valeurs que vous voulez stocker doivent pouvoir être rendues persistantes sous forme de chaîne ; c'est-à-dire ne constituer ni un SAFEARRAY, ni un objet, ni un stockage structuré. Si la variable ne peut pas être convertie en chaîne, une valeur de chaîne en anglais persiste, expliquant pourquoi la variable n'a pas été rendue persistante.

Chaque fois que des variables persistent, un nouvel enregistrement des variables et de leurs valeurs est créé.

Valeurs globales persistantes

L'exemple de macro suivant illustre l'utilisation de l'objet Globals et de ses membres pour conserver la valeur d'une variable après la fermeture d'une solution, ainsi que l'accès à cette valeur lorsque la solution est rouverte. Elle compte et renvoie le nombre de fois que le complément a été chargé.

Sub OnAddinLoaded(ByVal dte As DTE)
    ' Count the number of times an add-in is loaded
    ' and store the value in the solution.
    Dim globals As Globals
    globals = dte.Solution.Globals
    If globals.VariableExists("AddinLoadCounter") Then
        ' The counter has already been set, so increment it.
        Dim int32 As System.Int32
        int32 = System.Int32.Parse(CStr(globals("AddinLoadCounter")))
        int32 += 1
        globals("AddinLoadCounter") = int32.ToString()
    Else
        ' Counter has never been set, so create and initialize it.
        globals("AddinLoadCounter") = 1.ToString()
        globals.VariablePersists("AddinLoadCounter") = True
    End If
    MsgBox("This add-in has been loaded: " & _
    globals.VariableValue("AddinLoadCounter") & " times.")
End Sub
void OnAddinLoaded(_DTE applicationObject)
{
    // Count the number of times an add-in is loaded
    // and store the value in the solution.
    Globals globals;
    globals = applicationObject.Solution.Globals;
    if(globals.get_VariableExists("AddinLoadCounter"))
    {
        // The counter has already been set, so increment it.
        System.Int32 int32;
        int32 = System.Int32.Parse((string)
        globals["AddinLoadCounter"]);
        int32++;
        globals["AddinLoadCounter"] = int32.ToString();
    }
    else
    {
        // Counter has never been set, so create and initialize it.
        globals["AddinLoadCounter"] = 1.ToString();
        globals.set_VariablePersists("AddinLoadCounter", true);
    }
    System.Windows.Forms.MessageBox.Show("This add-in has been loaded: 
    " + globals.VariableValue["AddinLoadCounter"] + " times.");
}

Voir aussi

Tâches

Comment : ajouter et gérer des commandes

Comment : créer un complément

Procédure pas à pas : création d'un Assistant

Concepts

Graphique Modèle d'objet Automation

Autres ressources

Création et contrôle de fenêtres d'environnement

Création de compléments et d'Assistants

Guide de référence de l'extensibilité et de l'automation