2010-08-20 24 views
21

Actuellement, je stocke les paramètres de mes addins personnalisés dans le registre, mais cela ressemble à un kludge. Je me demandais s'il y avait un endroit officiel pour stocker les paramètres du complément. Ma préférence serait de les stocker où Visual Studio stocke les paramètres afin qu'ils puissent être exportés et importés facilement.Où un complément Visual Studio stocke-t-il ses paramètres?

Est-il possible de stocker les paramètres du complément avec les paramètres Visual Studio ou existe-t-il un meilleur moyen?

Répondre

8

EDIT

Ma réponse originale à ce sujet a eu quelques problèmes que j'ai découvert après des années d'utilisation. Je l'ai inclus ci-dessous pour la complétude, mais voici mes pensées mises à jour sur ce sujet.

L'utilisation des paramètres d'application n'est pas sécurisée par la version dans un VSIX. L'emplacement du chemin d'accès au fichier de paramètres stocké comprend en partie la chaîne de version et les hachages de l'exécutable. Lorsque Visual Studio installe une mise à jour officielle, ces valeurs changent et, par conséquent, modifient le chemin du fichier de paramètres. Visual Studio lui-même ne prend pas en charge l'utilisation des paramètres d'application, par conséquent, il ne fait aucune tentative de migration de ce fichier vers le nouvel emplacement et toutes les informations sont essentiellement perdues. La méthode de paramétrage prise en charge est WritableSettingsStore. Il est très similaire à des paramètres d'application et assez facile d'accès via SVsServiceProvider

public static WritableSettingsStore GetWritableSettingsStore(this SVsServiceProvider vsServiceProvider) 
{ 
    var shellSettingsManager = new ShellSettingsManager(vsServiceProvider); 
    return shellSettingsManager.GetWritableSettingsStore(SettingsScope.UserSettings); 
} 

Réponse originale

La voie la plus directe est d'utiliser Application Settings infrastructure .Net pour stocker les paramètres. C'est un framework mature avec un support de concepteur pour ajouter une infrastructure de paramètres à votre projet. Cependant, il n'intègre pas l'infrastructure de paramètres Import/Export de Visual Studio. Obtenir ce fonctionnement est un processus très complexe qui consiste à vous inscrire comme un VSPackage, mettre en œuvre un schéma de paramètres, etc ... Je trouve généralement que ça ne vaut vraiment pas la peine de fonctionner (jamais réussi)

+0

Je ne suis peut-être pas à l'aise car c'est la première fois que j'essaie de le faire, mais la seule façon de pouvoir utiliser votre nouveau code est de changer le type de paramètre de SVsServiceProvider à IServiceProvider. – jschroedl

9

Voici un petit tutoriel cela peut vous donner une idée de la façon d'y parvenir simplement (c'est assez simple une fois que vous l'avez fait une fois).

J'ai dérivé le code ci-dessous de ce que j'utilise dans my extensions; il est dans VB.NET, mais peut être facilement converti en C#. Pour commencer, ajoutez simplement cette classe à votre projet d'extension. Il doit contenir une propriété pour chaque valeur que vous devez stocker. Vous pouvez même les organiser en catégories. Vous pouvez regarder at MSDN here pour les types pris en charge (pour les cas plus complexes, vous pouvez vous référer à "pages d'options personnalisées", qui est un sujet couvert by MSDN here).

Imports Microsoft.VisualBasic 
Imports System 
Imports System.Diagnostics 
Imports System.Globalization 
Imports System.Runtime.InteropServices 
Imports System.ComponentModel.Design 
Imports Microsoft.Win32 
Imports Microsoft.VisualStudio 
Imports Microsoft.VisualStudio.Shell.Interop 
Imports Microsoft.VisualStudio.OLE.Interop 
Imports Microsoft.VisualStudio.Shell 
Imports System.Threading 
Imports System.Text.RegularExpressions 
Imports System.ComponentModel 

<ClassInterface(ClassInterfaceType.AutoDual)> 
<CLSCompliant(False), ComVisible(True)> 
Public Class OptionPageGrid 
    Inherits DialogPage 

    Private _MyBooleanSetting As Boolean = False 
    <Category("The name or an alias of my extension name")> 
    <DisplayName("Simple name of this setting displayed for the user")> 
    <Description("Longer description of this setting")> 
    Public Property MyBooleanSetting() As Boolean 
     Get 
      Return Me._MyBooleanSetting 
     End Get 
     Set(ByVal value As Boolean) 
      Me._MyBooleanSetting = value 
     End Set 
    End Property 

    Private _MyIntegerSetting As Integer = 2 
    <Category("The name or an alias of my extension name")> 
    <DisplayName("Simple name of this setting displayed for the user")> 
    <Description("Longer description of this setting")> 
    Public Property MyIntegerSetting() As Integer 
     Get 
      Return Me._MyIntegerSetting 
     End Get 
     Set(ByVal value As Integer) 
      Me._MyIntegerSetting = value 
     End Set 
    End Property 

    Private _MyStringSetting As String = "DefaultStringValue" 
    <Category("The name or an alias of my extension name")> 
    <DisplayName("Simple name of this setting displayed for the user")> 
    <Description("Longer description of this setting")> 
    Public Property MyStringSetting() As Integer 
     Get 
      Return Me._MyStringSetting 
     End Get 
     Set(ByVal value As Integer) 
      Me._MyStringSetting = value 
     End Set 
    End Property 
End Class 

Ensuite, ajoutez les attributs suivants juste avant votre classe de package principal.

<ProvideOptionPage(GetType(OptionPageGrid), "The name or an alias of my extension name", "The name of a category of settings", 0, 0, True)> 
Public NotInheritable Class MyExtensionMainClass 
    Inherits Package 

Maintenant, pour accéder facilement aux paramètres, vous pouvez ajouter la propriété suivante dans votre classe de carton d'emballage:

Protected ReadOnly Property Settings() As OptionPageGrid 
    Get 
     Return CType(GetDialogPage(GetType(OptionPageGrid)), OptionPageGrid) 
    End Get 
End Property 

Cela permet d'accéder à une valeur de partout dans la classe en utilisant un match amical:

If (Me.Settings.MyBooleanSetting) Then MsgBox("It works!"); 

Visual studio se chargera de la persistance des paramètres, et ils devraient être inclus lorsque vous utilisez la fonction d'importation/exportation (ou toute extension de synchronisation des paramètres comme this one).

+0

Merci pour les liens MSDN. Je le fais en C#, et leurs échantillons avec les vôtres ont rendu la tâche facile. Je noterai cependant pour les autres que vous montrez comment créer la page Options de la grille, alors que je voulais en créer une personnalisée, puisque je voulais que les utilisateurs cliquent sur les boutons. – deadlydog

+0

J'ai blogué sur la façon de créer une page d'options personnalisées en C# en utilisant un WPF UserControl pour l'interface utilisateur, car les liens MSDN montrent seulement comment le faire avec Windows Forms. http://blog.danskingdom.com/adding-a-wpf-settings-page-to-the-tools-options-dialog-window-for-your-visual-studio-extension/ – deadlydog