Подтвердить что ты не робот

Где должна быть добавлена ​​надстройка Visual Studio?

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

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

4b9b3361

Ответ 1

EDIT

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

Использование настроек приложения не является безопасным для версий в 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, реализацию схемы настроек и т.д. Я обычно считаю, что это действительно не стоит бежать (никогда не удавалось)

Ответ 2

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

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

Для начала просто добавьте этот класс в свой проект расширения. Он должен содержать свойство для каждого значения, которое вам нужно хранить. Вы даже можете распределить их по категориям. Вы можете посмотреть 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 позаботится о сохранении настроек, и они должны быть включены, когда вы используете функцию импорта/экспорта (или любое расширение синхронизации настроек, подобное этому).