2010-08-20 2 views
21

현재 레지스트리에 내 사용자 정의 추가 기능에 대한 설정을 저장하고 있지만 이것은 마치 진흙탕처럼 보입니다. 추가 기능 설정을 저장할 공식 장소가 있는지 궁금합니다. Visual Studio에서 설정을 저장하고 저장하여 쉽게 내보내고 가져올 수있는 환경을 선호합니다.Visual Studio 추가 기능은 어디에서 설정을 저장해야합니까?

Visual Studio 설정에서 추가 기능 설정을 저장할 수 있습니까? 아니면 더 좋은 방법이 있습니까?

답변

8

이 주제에 대한 내 원래 대답은 그것을 사용의 년 후에 내가 발견 한 문제의 몇했다

편집 할 수 있습니다. 나는 완전한 것을 위해 아래에 그것을 포함했다. 그러나 이것에 관한 나의 최근의 생각이 여기에있다.

응용 프로그램 설정의 사용은 VSIX에서 버전 안전하지 않습니다. 저장된 설정 파일 경로의 위치는 부분적으로 실행 파일의 버전 문자열과 해시를 포함합니다. Visual Studio에서 공식 업데이트를 설치하면 이러한 값이 변경되고 결과적으로 설정 파일 경로가 변경됩니다. Visual Studio 자체는 응용 프로그램 설정 사용을 지원하지 않으므로이 파일을 새 위치로 마이그레이션하지 않으므로 모든 정보가 손실됩니다. 지원되는 설정 방법은 WritableSettingsStore입니다. 그것은 SVsServiceProvider

가장 정직 방법은 설정을 저장하기 위해 닷넷의 Application Settings 인프라를 사용하는 것입니다

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

원래 대답을 통해 액세스 응용 프로그램 설정과 매우 유사하고 쉽게 충분하다. 프로젝트에 설정 인프라를 추가하는 디자이너 지원 기능을 갖춘 성숙한 프레임 워크입니다.

그러나 Visual Studio의 가져 오기/내보내기 설정 인프라와 통합되지 않습니다. 그 작업을하는 것은 VSPackage로 등록하고 설정 스키마를 구현하는 등 매우 복잡한 프로세스입니다. 일반적으로 실행하는 데 문제가되지 않습니다. (성공하지 못함)

+0

이것이 처음 시도한 이래로 나올 수도 있지만 더 새로운 코드를 사용할 수있는 유일한 방법은 매개 변수 유형을 SVsServiceProvider에서 IServiceProvider로 변경하는 것입니다. – jschroedl

9

다음은 빠른 자습서입니다. 이 방법은 간단하게 달성하는 방법에 대한 아이디어를 줄 수 있습니다 (한 번 수행하면 간단합니다).

아래 코드는 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!"); 

스튜디오들이 포함되어야하는 설정을 지속 돌봐 및됩니다 비주얼 당신은 가져 오기/내보내기 기능 (또는 설정 동기화 확장 등을 사용할 때 this one).

+0

MSDN 링크를 이용해 주셔서 감사합니다. C#에서이 작업을 수행하고 있으며, 샘플과 함께 샘플을 작성하여 실행하기가 쉽습니다. 그리드 옵션 페이지를 만드는 방법을 보여줄지라도 다른 것들을 주목할 것입니다. 그리드 옵션 페이지는 사용자가 버튼을 클릭하기를 원했기 때문에 맞춤형을 만들고 싶었습니다. – deadlydog

+0

UI 용 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

관련 문제