2010-08-20 9 views
21

Obecnie przechowuję ustawienia dla moich niestandardowych dodatków w rejestrze, ale wydaje się, że to kundel. Zastanawiam się, czy istnieje oficjalne miejsce do przechowywania ustawień dodatków. Moją preferencją byłoby przechowywanie ich tam, gdzie Visual Studio przechowuje ustawienia, aby można je było łatwo eksportować i importować.Gdzie powinien być zapisany program Visual Studio Add-in?

Czy można zapisać ustawienia dodatku przy użyciu ustawień Visual Studio, czy jest lepszy sposób?

Odpowiedz

8

EDIT

Mój oryginalny odpowiedzi na ten temat miał kilka problemów odkryłem po latach używania. Zawarłem to poniżej dla kompletności, ale oto moje zaktualizowane przemyślenia na ten temat.

Używanie ustawień aplikacji nie jest bezpieczne w wersji w systemie VSIX. Lokalizacja zapisanej ścieżki pliku ustawień w części obejmuje ciąg wersji i wartości skrótów pliku wykonywalnego. Kiedy Visual Studio instaluje oficjalną aktualizację, wartości te zmieniają się iw konsekwencji zmieniają ścieżkę pliku ustawień. Sam Visual Studio nie obsługuje ustawień aplikacji, dlatego nie podejmuje prób migracji tego pliku do nowej lokalizacji, a wszystkie informacje są w zasadzie utracone. Obsługiwaną metodą ustawień jest WritableSettingsStore. Jest bardzo podobny do ustawień aplikacji i dość łatwe do dostępu poprzez SVsServiceProvider

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

Original Odpowiedź

Najbardziej prostym rozwiązaniem jest użycie Application Settings infrastruktury .NET, aby zapisać wszystkie ustawienia. Jest to dojrzałe środowisko z projektantem wspierającym dodawanie infrastruktury ustawień do projektu.

Nie integruje się jednak z infrastrukturą ustawień importu/eksportu programu Visual Studio. Uzyskanie tej pracy jest bardzo zaangażowanym procesem, który obejmuje rejestrowanie się jako VSPackage, implementowanie schematu ustawień itd. Ogólnie uważam, że naprawdę nie jest to warte problemów z uruchomieniem (nigdy się nie udało).

+0

Mogę być daleko, ponieważ jest to moja pierwsza próba, ale jedynym sposobem, w jaki wydaje mi się, że mogę użyć twojego nowszego kodu, jest zmiana typu parametru z SVsServiceProvider na IServiceProvider. – jschroedl

9

Oto krótki samouczek to może dać ci wyobrażenie, jak to osiągnąć w prosty sposób (jest to całkiem proste, gdy raz to zrobisz).

Otrzymałem poniższy kod z tego, co używam w my extensions; jest w VB.NET, ale można go łatwo przekonwertować na C#.

Aby rozpocząć, po prostu dodaj tę klasę do swojego projektu rozszerzenia. Powinien zawierać właściwość dla każdej wartości, którą chcesz przechowywać. Możesz nawet rozmieścić je w kategoriach. Możesz sprawdzić, które typy są obsługiwane (w przypadku bardziej złożonych przypadków możesz odwoływać się do "spersonalizowanych stron opcji", które są tematem obejmującym 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 

Następnie dodaj następujące atrybuty tuż przed swoją klasą pakietu nadrzędnego.

<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 

Teraz w łatwy sposób uzyskać dostęp do ustawień, można dodać następującą właściwość w Master Class pakietu:

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

Pozwala to na dostęp do wartości z dowolnego miejsca w klasie używając przyjazne:

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

Visual Studio zajmie utrzymujących ustawienia, a powinny być one uwzględnione podczas korzystania z funkcji importu/eksportu (lub jakiegokolwiek rozszerzenia ustawienia synchronizacji jak this one).

+0

Dzięki za linki MSDN. Robię to w języku C#, a ich próbki wraz z twoimi sprawiają, że bardzo łatwo zacząć działać. Zauważam dla innych, że pokazujesz, jak utworzyć stronę opcji siatki, gdzie chciałem stworzyć niestandardową, ponieważ chciałem, aby użytkownicy klikali. – deadlydog

+0

Blogowałem o tym, jak utworzyć stronę opcji niestandardowych w języku C#, używając interfejsu użytkownika WPF dla interfejsu użytkownika, ponieważ łącza MSDN pokazują tylko, jak to zrobić w przypadku formularzy Windows. http://blog.danskingdom.com/adding-a-wpf-settings-page-to-tools-options-dialog-window-for-your-visual-studio-extension/ – deadlydog

Powiązane problemy