Visual Studio插件应该将其设置存储在哪里?

23

目前,我将自定义插件的设置存储在注册表中,但这似乎有点笨拙。我想知道是否有官方的地方可以存储插件设置。我的首选是将它们存储在Visual Studio存储设置的位置,以便可以轻松导出和导入。

是否可以将插件设置与Visual Studio设置一起存储,或者是否有更好的方法?

2个回答

10

编辑

我最初回答这个主题时发现了一些问题。在使用多年后,我将其包含在下面以保证完整性,但以下是我更新的想法。

在VSIX中,应用程序设置不是版本安全的。存储设置文件路径的位置部分包括可执行文件的版本字符串和哈希值。当Visual Studio安装官方更新时,这些值会发生变化,因此更改设置文件路径。Visual Studio本身不支持应用程序设置,因此不会尝试迁移此文件到新位置,所有信息基本上都丢失了。 支持的设置方法是WritableSettingsStore。它非常类似于应用程序设置,并且很容易通过SVsServiceProvider访问。

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

Translated Answer

最直接的方法是使用 .Net 的 应用程序设置 基础结构来存储任何设置。这是一个成熟的框架,支持在项目中添加设置基础结构的设计师支持。

然而,它不与Visual Studio的导入/导出设置基础结构集成。将其与之配合使用是一个非常复杂的过程,包括注册自己为VSPackage、实现设置模式等等...我通常发现它并不值得费力去运行(从未成功过)。


1
我可能完全错了,因为这是我第一次尝试,但似乎我唯一能够使用您的新代码的方法是将参数类型从SVsServiceProvider更改为IServiceProvider。 - jschroedl

9

这里是一个快速教程,可以让您了解如何简单地实现此目标(一旦您完成一次,它就非常简单)。

我从我的扩展中提取了下面的代码; 它是用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会负责持久化设置,当您使用导入/导出功能(或任何设置同步扩展,如此这个)时,它们应该被包含在内。

感谢提供的MSDN链接。我正在使用C#进行开发,他们的示例以及您的示例使得启动和运行变得非常容易。但是我想提醒其他人,您展示了如何创建网格选项页面,而我想创建一个自定义页面,因为我需要为用户提供按钮。 - deadlydog
我已经撰写了关于如何使用WPF UserControl创建C#自定义选项页的博客文章,因为MSDN链接只显示如何使用Windows Forms进行操作。http://blog.danskingdom.com/adding-a-wpf-settings-page-to-the-tools-options-dialog-window-for-your-visual-studio-extension/ - deadlydog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接