Где надстройка Visual Studio должна хранить свои настройки? - PullRequest
21 голосов
/ 21 августа 2010

В настоящее время я храню настройки для своих пользовательских надстроек в реестре, но это похоже на пометку.Мне было интересно, есть ли официальное место для хранения настроек надстроек.Я бы предпочел хранить их там, где Visual Studio хранит настройки, чтобы их можно было легко экспортировать и импортировать.

Можно ли сохранить настройки надстроек с настройками Visual Studio или есть лучший способ?

Ответы [ 2 ]

9 голосов
/ 06 июня 2011

Вот краткое руководство, которое может дать вам представление о том, как этого добиться просто (это довольно просто, если вы сделали это один раз).

Я получил следующий код из того, что я использую в моих расширениях ; это в VB.NET, но может быть легко преобразовано в C #.

Для начала просто добавьте этот класс в свой проект расширения. Он должен содержать свойство для каждого значения, которое вам нужно хранить. Вы даже можете распределить их по категориям. Вы можете посмотреть на MSDN здесь для поддерживаемых типов (для более сложных случаев вы можете обратиться к "настраиваемым страницам опций", которые являются темой MSDN здесь ).

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

Затем добавьте следующие атрибуты непосредственно перед вашим классом мастер-пакета.

<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

Теперь, чтобы легко получить доступ к настройкам, вы можете добавить следующее свойство в свой класс мастер-пакета:

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

Это позволяет получить доступ к значению из любой точки класса с помощью дружественного:

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

Visual Studio позаботится о сохранении настроек, и они должны быть включены при использовании функции импорта / экспорта (или любого расширения синхронизации настроек, например , ).

8 голосов
/ 21 августа 2010

РЕДАКТИРОВАТЬ

В моем первоначальном ответе на эту тему было несколько проблем, которые я обнаружил после нескольких лет его использования.Я включил его ниже для полноты, но вот мои обновленные мысли по этому поводу.

Использование настроек приложения небезопасно для версии в VSIX.Расположение сохраненного пути к файлу настроек частично включает строку версии и хеши исполняемого файла.Когда Visual Studio устанавливает официальное обновление, эти значения изменяются и, как следствие, меняют путь к файлу настроек.Сама Visual Studio не поддерживает использование параметров приложения, поэтому не пытается перенести этот файл в новое место, и вся информация по существу теряется.Поддерживаемый метод настроек - WritableSettingsStore.Он очень похож на настройки приложения и достаточно прост для доступа через SVsServiceProvider

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

Оригинальный ответ

Самый простой способ - использовать Приложение .NetНастройки Инфраструктура для хранения любых настроек.Это зрелая среда с дизайнерской поддержкой для добавления инфраструктуры настроек в ваш проект.

Однако он не интегрируется с инфраструктурой параметров импорта / экспорта Visual Studio.Начало этой работы - очень сложный процесс, который включает в себя регистрацию себя в качестве VSPackage, реализацию схемы настроек и т. Д. Я обычно нахожу, что действительно не стоит начинать работу (никогда не получалось)

...