目前我正在我的自定義插件的設置存儲在註冊表中,但這看起來像一個kludge。我想知道是否有一個官方的地方來存儲加載項設置。我最喜歡將它們存儲在Visual Studio存儲設置的位置,以便它們可以輕鬆導出和導入。Visual Studio加載項應該在哪裏存儲它的設置?
是否可以將附加設置存儲在Visual Studio設置中,還是有更好的方法?
目前我正在我的自定義插件的設置存儲在註冊表中,但這看起來像一個kludge。我想知道是否有一個官方的地方來存儲加載項設置。我最喜歡將它們存儲在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);
}
原來的答案
最直接的方法是使用NET的Application Settings基礎設施來存儲任何設置非常相似,應用程序設置和足夠容易訪問。這是一個成熟的框架,支持爲您的項目添加設置基礎設施。
但它不與Visual Studio的導入/導出設置基礎結構集成。獲得該工作是一個非常複雜的過程,其中包括登記自己作爲一個VSPackage的,實施設置模式,等等。總的來說,我發現它真的不值得讓跑的麻煩(沒有成功)
這裏是一個快速教程這可能會讓你知道如何簡單地完成這件事(一旦你完成了一次,這很簡單)。
我推導出我在my extensions中使用的代碼如下:它在VB.NET中,但可以很容易地轉換爲C#。
要開始,只需將此類添加到您的擴展項目。它應該包含您需要存儲的每個值的屬性。你甚至可以安排他們的類別。對於支持的類型,您可能會看到at MSDN here(對於更復雜的情況,您可以參考「自定義選項頁面」,這是涵蓋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
然後,在您的主包類之前添加以下屬性。
<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將採取持續的設置照顧,他們應該被包含在您使用導入/導出功能(或任何設置同步等擴展this one)。
感謝您的MSDN鏈接。我在C#中這樣做,他們的樣本以及你的樣本使得它很容易啓動和運行。我會注意到其他人,雖然你展示瞭如何創建網格選項頁面,因爲我想創建一個自定義的頁面,因爲我想讓用戶點擊按鈕。 – deadlydog 2014-02-21 22:22:27
我已經博客瞭如何在C#中使用WPF用戶控件爲UI創建自定義選項頁面,因爲MSDN鏈接僅顯示如何使用Windows窗體進行操作。 http://blog.danskingdom.com/adding-a-wpf-settings-page-to-the-tools-options-dialog-window-for-your-visual-studio-extension/ – deadlydog 2014-04-25 21:04:15
我可能會離開,因爲這是我第一次嘗試這樣做,但我似乎能夠使用您的新代碼的唯一方法是將參數類型從SVsServiceProvider更改爲IServiceProvider。 – jschroedl 2015-08-19 18:56:35