如何:使用托管包结构的导入设置

Visual Studio 集成 (IDE)开发环境 (ide) 使用实现 IProfileManager 接口和注册支持 VSPackage 实现的类。 此实现用于检索 VSPackage 的状态。

由于 IDE 实例化实现 IProfileManager 接口支持 Visual Studio 设置的类,在独立类应实现 IProfileManager 接口。

备注

不要实现该类的 IProfileManager 实现 Package

实现一组导出

  1. 声明实现 Visual Studio 设置的类。

    类声明为实现 IProfileManager 并为其提供 GUID。

    备注

    实现 IProfileManager 接口的类还必须实现 IComponent 接口,可以由派生类来完成从 Component 类。

    例如:

    [Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")]
    internal class MyPackageProfileManager : Component, IProfileManager 
    
  2. 确保实现设置的类从磁盘检索状态数据。

    此步骤通过执行 LoadSettingsFromXml 方法执行。

    保持的具体信息和该信息如何从 VSPackage 中获取和排列为每个 VSPackage 不同。

    无论将由 VSPackage 保留的信息, IProfileManager 实现的类必须使用所提供的 IVsSettingsReader 接口从设置文件中检索数据。

    通常,在下面的示例中, LoadSettingsFromXml 来验证检索的数据和更新 VSPackage 的状态。

    Dim mySvc As MyPackageService = TryCast(GetService(GetType(IVSMDMyPackage)), MyPackageService) 
    If mySvc IsNot Nothing Then 
        Dim value As String 
        Dim myState As StateObject = mySvc.MyPackage.packageState 
        reader.ReadSettingString("PbrsShowDesc", value) 
        If value Is Nothing OrElse value = "" Then 
            reader.ReportError("Unable to Help Visibility Setting") 
        Else 
            myState.HelpVisible = Not value.Equals("0") 
        End If 
        reader.ReadSettingString("PbrsAlpha", value) 
        If value Is Nothing OrElse value = "" Then 
            reader.ReportError("Unable to Retrieve Sort Value") 
        Else 
            If Not value.Equals("0") Then 
                myState.SortState = SortState.Alphabetical 
            Else 
                myState.SortState = SortState.Categorized 
            End If 
        End If 
    End If
    
    MyPackageService mySvc = GetService(typeof(IVSMDMyPackage)) as MyPackageService;
    if (mySvc != null){
      string value;
      StateObject myState = mySvc.MyPackage.packageState;
      reader.ReadSettingString("PbrsShowDesc", out value);
      if (value == null || value == ""){
          reader.ReportError("Unable to Help Visibility Setting");
      }else{
          myState.HelpVisible = !value.Equals("0");
      }
      reader.ReadSettingString("PbrsAlpha", out value);
      if (value == null || value == ""){
          reader.ReportError("Unable to Retrieve Sort Value");
      }else{
        if (!value.Equals("0")){
          myState.SortState = SortState.Alphabetical;
        }else{
          myState.SortState = SortState.Categorized;
        }
      }
    }
    

    实现详细信息:

    • 使用 IVsSettingsReader 接口的 ReportError 方法,以交互方式报告错误返回用户通过 IDE:

      reader.ReadSettingString("PbrsAlpha", value) 
      If value Is Nothing OrElse value = "" Then 
          reader.ReportError("Unable to Retrieve Sort Value") 
      End If
      
        reader.ReadSettingString("PbrsAlpha", out value);
        if (value == null || value == ""){
            reader.ReportError("Unable to Retrieve Sort Value");
        }
      
    • 在实际检索存储设置之前, LoadSettingsFromXml 方法的实现应使用 ReadFileVersion 方法验证导出存储设置的支持 Visual Studio 的该版本。

      在下面的示例中,实现检查设置是否由 Visual Studio 的版本与 m_supportVer的主版本号的生成,如果不是,信号错误。

      If pnMajor <> m_supportVer Then 
          reader.ReportError("Unsupported Version") 
      End If
      
      if (pnMajor != m_supportVer){
        reader.ReportError("Unsupported Version");
      }
      
    • Visual Studio 设置文件支持随机数据访问,因此,读取和编写器设置操作的顺序并不重要。 在下面的示例中,编写器操作的顺序。 SaveSettingsToXml 方法的实现了读取操作的相反值在 LoadSettingsFromXml 方法的。

    • pszSettingName 参数的值提供给 IVsSettingsWriter 接口的方法必须唯一标识每个将设置类别中保存的数据元素。

      备注

      名称只需要的唯一在实现类的范围内,因为 IDE 使用实现一组和 pszSettingName 的值标识每个已保存的设置类的 GUID。如果多个 IVsSettingsWriter 方法调用与 pszSettingName的值相同,则原始值在设置文件复盖。

  3. 确保在 VSPackage 状态和本地存储的或缓存的设置之间的一致性。

    此步骤将在 SaveSettingsToStorage 方法的实现时通常执行 (如以下示例中所示)。 此步骤详细信息特定于 VSPackage,也可以包含获取 VSPackage 的状态从自动化的,查询 VSPackage 和设置注册表项。

    备注

    LoadSettingsFromStorage 方法应检索 SaveSettingsToStorage 方法保存的信息,请 LoadSettingsFromStorage 方法由 IDE 调用它支持其 VSPackage 初始化时。

    在下面的示例中,提供设置的类支持实现 SaveSettingsToStorage 方法:

    • 获取对 VSPackage 中已更新的状态信息的访问。

      Dim mySvc As MyPackageService = TryCast(GetService(GetType(IVSMDMyPackage)), MyPackageService) 
      Dim package As Package = TryCast(GetService(GetType(Package)), Package) 
      Dim rootKey As RegistryKey = package.UserRegistryRoot
      
      MyPackageService mySvc = GetService(typeof(IVSMDMyPackage)) as MyPackageService;
      Package package = GetService(typeof(Package)) as Package;
      RegistryKey rootKey = package.UserRegistryRoot;
      
    • 使用该信息更新 VSPackage 的注册表设置。

      If mySvc.MyPackage.packageState IsNot Nothing Then 
          Using rootKey 
              Using pbrsKey As RegistryKey = rootKey.CreateSubKey(Me.[GetType]().Name) 
                  Using pbrsKey 
                      DirectCast(mySvc.MyPackage.packageState, IComPropertyBrowser).SaveState(pbrsKey) 
                  End Using 
              End Using 
          End Using 
      End If
      
      if (mySvc.MyPackage.packageState != null) {
        using (rootKey) {
          using(RegistryKey pbrsKey = rootKey.CreateSubKey(this.GetType().Name)) {
            using (pbrsKey) {
              ((IComPropertyBrowser)mySvc.MyPackage.packageState).SaveState(pbrsKey);
            }
          }
        }
      }
      
    • 备注

      操作的工作划分在 LoadSettingsFromXmlSaveSettingsToStorage 方法之间的是依赖于实现是某些任意的。例如,实现可以将复盖在 SaveSettingsToXml 方法和所有注册表和状态查询的执行一次空实现 LoadSettingsFromStorage 方法。

  4. 注册类为提供的 set 支持对 VSPackage 的实现。

    应用 ProvideProfileAttribute 实例构造方式使用类的 Type 实现 IProfileManager 到 VSPackage 中 Package 实现。

    <ProvideProfile(GetType(MyPackageProfileManager), "CoreUI", "MyPackage", 1004, 1004, False)> _ 
    <Guid("YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY")> _ 
    Class MyPackage 
        Inherits Package 
    End Class
    
     [ProvideProfile(typeof(MyPackageProfileManager), "CoreUI", "MyPackage", 1004, 1004, false)]
    [Guid("YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY")]
    class MyPackage: Package 
    

    在本例中,特性通知 IDE MyPackageProfileManager 类提供一次一组实现。 MyPackage 类。 自定义在注册表下落点是在 \Software\Microsoft\VisualStudio HKLM \Version\UserSettings\ CoreUI_MyPackage 下,其中 Version 是 Visual Studio的版本,如 8.0。

    有关更多信息,请参见 保留的设置ProvideProfileAttribute

示例

下面的示例在类中实现 IProfileManager

Imports System 
Imports System.Runtime.InteropServices 
Imports Microsoft.VisualStudio.Shell 
Imports Microsoft.VisualStudio.Shell.Interop 
Imports Microsoft.Win32 
Imports myPackageNameSpace 
Namespace myProfileManagerNameSpace 
    
    
    <Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")> _ 
    Friend Class MyPackageProfileManager 
        Inherits System.ComponentModel.Component 
        Implements IProfileManager 
        Friend Const m_supportVer As Integer = 8 
        Public Sub SaveSettingsToXml(ByVal writer As IVsSettingsWriter) 
            Dim mySvc As MyPackageService = TryCast(GetService(GetType(MyPackage)), MyPackageService) 
            If mySvc IsNot Nothing Then 
                ' Information is stored in a StateObject. 
                Dim myState As StateObject = mySvc.MyPackage.packageState 
                writer.WriteSettingString("PbrsAlpha", (If(myState.SortState = SortState.Alphabetical, "1", "0"))) 
                writer.WriteSettingString("PbrsShowDesc", (If(myState.HelpVisible, "1", "0"))) 
            End If 
        End Sub 
        
        Public Sub LoadSettingsFromXml(ByVal reader As IVsSettingsReader) 
            
            Dim pnMajor As Integer, pnMinor As Integer, pnBuild As Integer 
            ' First check if we are getting data from the correct major version. 
            reader.ReadVersion(pnMajor, pnMinor, pnBuild) 
            If pnMajor <> m_supportVer Then 
                reader.ReportError("Unsupported Version") 
            Else 
                Dim mySvc As MyPackageService = TryCast(GetService(GetType(IVSMDMyPackage)), MyPackageService) 
                If mySvc IsNot Nothing Then 
                    Dim value As String 
                    Dim myState As StateObject = mySvc.MyPackage.packageState 
                    reader.ReadSettingString("PbrsShowDesc", value) 
                    ' Not all values must be present. 
                    If value Is Nothing OrElse value = "" Then 
                        reader.ReportError("Unable to Help Visibility Setting") 
                    Else 
                        myState.HelpVisible = Not value.Equals("0") 
                    End If 
                    reader.ReadSettingString("PbrsAlpha", value) 
                    ' Not all values must be present. 
                    If value Is Nothing OrElse value = "" Then 
                        reader.ReportError("Unable to Retrieve Sort Value") 
                    Else 
                        If Not value.Equals("0") Then 
                            myState.SortState = SortState.Alphabetical 
                        Else 
                            myState.SortState = SortState.Categorized 
                        End If 
                    End If 
                End If 
            End If 
        End Sub 
        
        Public Sub SaveSettingsToStorage() 
            Dim mySvc As MyPackageService = TryCast(GetService(GetType(IVSMDMyPackage)), MyPackageService) 
            Dim package As Package = TryCast(GetService(GetType(Package)), Package) 
            Dim rootKey As RegistryKey = package.UserRegistryRoot 
            
            If mySvc.MyPackage.packageState IsNot Nothing Then 
                Using rootKey 
                    Using pbrsKey As RegistryKey = rootKey.CreateSubKey(Me.[GetType]().Name) 
                        Using pbrsKey 
                            DirectCast(mySvc.MyPackage.packageState, IComPropertyBrowser).SaveState(pbrsKey) 
                        End Using 
                    End Using 
                End Using 
            End If 
        End Sub 
        
        Public Sub LoadSettingsFromStorage() 
            Dim mySvc As MyPackageService = TryCast(GetService(GetType(IVSMDMyPackage)), MyPackageService) 
            Dim package As Package = TryCast(GetService(GetType(Package)), Package) 
            Dim rootKey As RegistryKey = package.UserRegistryRoot 
            Using rootKey 
                Dim pbrsKey As RegistryKey = rootKey.OpenSubKey(Me.[GetType]().Name) 
                If pbrsKey IsNot Nothing Then 
                    Using pbrsKey 
                        If mySvc.MyPackage.MakeCurrentSettingTheDefault() Then 
                            DirectCast(mySvc.MyPackage.packageState, IComPropertyBrowser).SaveState(pbrsKey) 
                        Else 
                            DirectCast(mySvc.MyPackage.packageState, IComPropertyBrowser).LoadState(pbrsKey) 
                        End If 
                    End Using 
                End If 
            End Using 
        End Sub 
    End Class 
End Namespace
namespace myProfileManagerNameSpace  {
  
  using System;
  using System.Runtime.InteropServices;
  using Microsoft.VisualStudio.Shell;
  using Microsoft.VisualStudio.Shell.Interop;
  using Microsoft.Win32;
  using myPackageNameSpace;
  
  
  [Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")]
  internal class MyPackageProfileManager : System.ComponentModel.Component , IProfileManager {
    internal const int m_supportVer = 8;
    public void SaveSettingsToXml(IVsSettingsWriter writer) {
      MyPackageService mySvc = GetService(typeof(MyPackage)) as MyPackageService;
      if (mySvc != null) {
        // Information is stored in a StateObject.
        StateObject myState = mySvc.MyPackage.packageState;
        writer.WriteSettingString( 
                                  "PbrsAlpha", 
                                  (myState.SortState == SortState.Alphabetical ? "1" : "0"));
        writer.WriteSettingString( 
                                  "PbrsShowDesc", 
                                  (myState.HelpVisible ? "1" : "0"));
      }
    }
    
    public void LoadSettingsFromXml(IVsSettingsReader reader)
    {
      
      int pnMajor, pnMinor, pnBuild;
      // First check if we are getting data from the correct major version. 
      reader.ReadVersion(pnMajor, pnMinor, pnBuild);
      if (pnMajor != m_supportVer){
        reader.ReportError("Unsupported Version");
      }else{
        MyPackageService mySvc = GetService(typeof(IVSMDMyPackage)) as MyPackageService;
        if (mySvc != null){
          string value;
          StateObject myState = mySvc.MyPackage.packageState;
          reader.ReadSettingString("PbrsShowDesc", out value);
          // Not all values must be present.
          if (value == null || value == ""){
              reader.ReportError("Unable to Help Visibility Setting");
          }else{
            myState.HelpVisible = !value.Equals("0");
          }
          reader.ReadSettingString("PbrsAlpha", out value);
          // Not all values must be present.
          if (value == null || value == ""){
              reader.ReportError("Unable to Retrieve Sort Value");
          }else{
            if (!value.Equals("0")){
              myState.SortState = SortState.Alphabetical;
            }else{
              myState.SortState = SortState.Categorized;
            }
          }
        }
      }
    }

    public void SaveSettingsToStorage() {
      MyPackageService mySvc = GetService(typeof(IVSMDMyPackage)) as MyPackageService;
      Package package = GetService(typeof(Package)) as Package;
      RegistryKey rootKey = package.UserRegistryRoot;
      
      if (mySvc.MyPackage.packageState != null) {
        using (rootKey) {
          using(RegistryKey pbrsKey = rootKey.CreateSubKey(this.GetType().Name)) {
            using (pbrsKey) {
              ((IComPropertyBrowser)mySvc.MyPackage.packageState).SaveState(pbrsKey);
            }
          }
        }
      }
    }
    
    public void LoadSettingsFromStorage() {
      MyPackageService mySvc = GetService(typeof(IVSMDMyPackage)) as MyPackageService;
      Package package = GetService(typeof(Package)) as Package;
      RegistryKey rootKey = package.UserRegistryRoot;
      using (rootKey) {
        RegistryKey pbrsKey = rootKey.OpenSubKey(this.GetType().Name);
        if (pbrsKey != null) {
          using (pbrsKey) {
            if (mySvc.MyPackage.MakeCurrentSettingTheDefault()){
              ((IComPropertyBrowser)mySvc.MyPackage.packageState).SaveState(pbrsKey);
            }else{
              ((IComPropertyBrowser)mySvc.MyPackage.packageState).LoadState(pbrsKey);
            }
          }
        }
      }
    }
  }
}

请参见

任务

如何:使用托管包结构的导出设置

参考

IProfileManager

IVsSettingsWriter

概念

保留的设置