目前,我将自定义插件的设置存储在注册表中,但这似乎有点笨拙。我想知道是否有官方的地方可以存储插件设置。我的首选是将它们存储在Visual Studio存储设置的位置,以便可以轻松导出和导入。
是否可以将插件设置与Visual Studio设置一起存储,或者是否有更好的方法?
目前,我将自定义插件的设置存储在注册表中,但这似乎有点笨拙。我想知道是否有官方的地方可以存储插件设置。我的首选是将它们存储在Visual Studio存储设置的位置,以便可以轻松导出和导入。
是否可以将插件设置与Visual Studio设置一起存储,或者是否有更好的方法?
编辑
我最初回答这个主题时发现了一些问题。在使用多年后,我将其包含在下面以保证完整性,但以下是我更新的想法。
在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、实现设置模式等等...我通常发现它并不值得费力去运行(从未成功过)。
这里是一个快速教程,可以让您了解如何简单地实现此目标(一旦您完成一次,它就非常简单)。
我从我的扩展中提取了下面的代码; 它是用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!");