2010-08-20 17 views
21

Attualmente sto memorizzando le impostazioni per i miei add-on personalizzati nel registro ma questo mi sembra un kludge. Mi stavo chiedendo se esistesse un luogo ufficiale in cui archiviare le impostazioni dei componenti aggiuntivi. La mia preferenza sarebbe di memorizzarli in cui Visual Studio memorizza le impostazioni in modo che possano essere esportate e importate facilmente.Dove deve essere memorizzato un componente aggiuntivo di Visual Studio?

È possibile memorizzare le impostazioni del componente aggiuntivo con le impostazioni di Visual Studio o esiste un modo migliore?

risposta

8

EDIT

La mia risposta originale a questo argomento ha avuto un paio di problemi che ho scoperto dopo anni di utilizzo. L'ho incluso di seguito per completezza, ma ecco le mie riflessioni aggiornate su questo.

L'uso delle impostazioni dell'applicazione non è sicuro per la versione in un VSIX. La posizione del percorso del file di impostazioni memorizzato in parte include la stringa di versione e gli hash dell'eseguibile. Quando Visual Studio installa un aggiornamento ufficiale, questi valori cambiano e, di conseguenza, cambia il percorso del file di impostazione. Visual Studio stesso non supporta l'utilizzo delle impostazioni dell'applicazione, quindi non fa alcun tentativo di migrare questo file nella nuova posizione e tutte le informazioni vengono sostanzialmente perse. Il metodo di impostazioni supportato è WritableSettingsStore. E 'molto simile a impostazioni dell'applicazione e abbastanza facile da accesso tramite SVsServiceProvider

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

risposta originale

La via da seguire più dritta è quella di utilizzare l'infrastruttura di Net Application Settings per memorizzare le impostazioni. È una struttura matura con il supporto del designer per l'aggiunta di un'infrastruttura di impostazioni al progetto.

Tuttavia non si integra con l'infrastruttura delle impostazioni di importazione/esportazione di Visual Studio. Ottenere che funziona è un processo molto impegnativo che include la registrazione come VSPackage, l'implementazione di uno schema di impostazioni, ecc ... In genere, trovo che non valga davvero la pena di essere eseguito (mai riuscito)

+0

È possibile che non sia disponibile poiché è la prima volta che cerco di eseguire questa operazione, ma l'unico modo in cui mi sembra possibile utilizzare il codice più recente consiste nel modificare il tipo di parametro da SVsServiceProvider a IServiceProvider. – jschroedl

9

Ecco un breve tutorial potrebbe darti un'idea di come ottenere ciò semplicemente (è abbastanza semplice una volta che l'hai fatto una volta).

Ho derivato il codice seguente da quello che utilizzo in my extensions; è in VB.NET, ma può essere facilmente convertito in C#.

Per iniziare, è sufficiente aggiungere questa classe al progetto di estensione. Dovrebbe contenere una proprietà per ogni valore che è necessario memorizzare. Puoi persino organizzarli in categorie. È possibile avere un aspetto at MSDN here per i tipi supportati (per i casi più complessi si può fare riferimento a "pagine di opzioni personalizzate", che è un argomento coperto 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 

Quindi aggiungere i seguenti attributi subito prima della classe del pacchetto principale.

<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 

Ora per accedere con facilità le impostazioni, è possibile aggiungere la seguente proprietà nel Master Class pacchetto:

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

In questo modo è possibile accedere a un valore da qualsiasi parte della classe con un amichevole:

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

Visual Studio si prenderà cura di persistenza delle impostazioni, e dovrebbero essere inclusi quando si utilizza la funzione di importazione/esportazione (o qualsiasi estensione impostazioni di sincronizzazione come this one).

+0

Grazie per i collegamenti MSDN. Lo sto facendo in C#, ed i loro campioni insieme al tuo hanno reso molto facile la messa in funzione. Per gli altri noterò che mostri come creare la pagina delle opzioni della griglia, dove volevo creare una pagina personalizzata, poiché volevo che i pulsanti facessero clic sugli utenti. – deadlydog

+0

Ho bloggato su come creare una pagina delle opzioni personalizzate in C# utilizzando un UserControl WPF per l'interfaccia utente, poiché i collegamenti MSDN mostrano solo come farlo con Windows Form. http://blog.danskingdom.com/adding-a-wpf-settings-page-to-the-tools-options-dialog-window-for-your-visual-studio-extension/ – deadlydog

Problemi correlati