Поделиться через


Практическое руководство. Экспорт параметров с помощью MPF

Visual Studio интегрированная среда разработки (ide) использует классы, реализующие IProfileManager интерфейс и классы, которые зарегистрированы как обслуживать заданный реализацию VSPackage, чтобы сохранить состояние VSPackage.

Поскольку создает интегрированной среды разработки класс, реализующий IProfileManager интерфейс для поддержки параметров IProfileManager быть реализовано в независимом классе.

Примечание

Не реализуйте IProfileManager в классе, который реализует Package.

Реализовать экспорт параметров

  1. Объявите класс, реализующий Visual Studio параметры.

    Объявите класс как реализация IProfileManager интерфейс и предоставляет его с GUID.

    Примечание

    Классы, реализующие IProfileManager должны также реализует IComponent.Это делается путем наследования от класса Component.

    Примеры.

    [Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")]
    internal class MyPackageProfileManager : Component, IProfileManager 
    
  2. Убедитесь, что класс, который реализует параметры возвращает правильные сведения о состоянии. Эта процедура относится к каждому VSPackage, и может включать получить состояние автоматизации, запроса разделы реестра или запросить VSPackage.

    Как правило, например в следующем примере используется реализация LoadSettingsFromStorage метод, который требуется проверить и сведения о состоянии VSPackage стадии.

    Примечание

    LoadSettingsFromStorage метод также вызывается средой разработки, когда он инициализирует VSPackage, он поддерживает.

    В этом случае реализация LoadSettingsFromStorage метод выполняет следующие действия:

    • Получает доступ к сведениям о состоянии в конфигурации и конфигурации 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;
      
    • В зависимости от значения, возвращенного MakeCurrentSettingTheDefault метод VSPackage или обновляет параметры реестра с использованием текущего состояния VSPackage или состояния с помощью параметров реестра.

      If mySvc.MyPackage.MakeCurrentSettingTheDefault() Then 
          DirectCast(mySvc.MyPackage.packageState, IComPropertyBrowser).SaveState(pbrsKey) 
      Else 
          DirectCast(mySvc.MyPackage.packageState, IComPropertyBrowser).LoadState(pbrsKey) 
      End If
      
      if (mySvc.MyPackage.MakeCurrentSettingTheDefault()){
        ((IComPropertyBrowser)mySvc.MyPackage.packageState).SaveState(pbrsKey);
      }else{
        ((IComPropertyBrowser)mySvc.MyPackage.packageState).LoadState(pbrsKey);
      }
      

      Для простоты в этом примере, если MakeCurrentSettingsTheDefault метод возвращает trueтекущее состояние всегда было сброшено значение по умолчанию, которое хранится в реестре.

  3. Убедитесь, что класс, реализующий эти параметры также сохраняет состояние на диск.

    Фактическая запись сведений о состоянии в файл на диске параметров всегда должна быть выполнена реализацией класса SaveSettingsToXml метод. Особенности зависит от реализации операции писателя параметров.

    Однако класс должен получить доступ к сведениям о состоянии и должен использовать предоставленное IVsSettingsWriter интерфейс, чтобы сохранять данные в файле параметра.

    Как правило, например в следующем примере реализация SaveSettingsToXml метод не проверяет сведения о состоянии. Проверка выполняется в LoadSettingsFromStorage метод. Вместо этого реализация просто получает доступ к сведениям о состоянии и записывает ее в данном случае как данные строк.

    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
    
    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"));
    }
    

    Сведения о реализации следующим образом:

    • В дополнение к данным, написанным с явно и прозрачному ExportSettings реализация метода API также сохраняет параметры Visual Studio сведения о версии. Таким образом, сохраняется параметры могут быть сравнивается с версии интегрированной среды разработки, сформировавшего их во время импорта параметров.

    • Значение pszSettingName аргумент, переданный методу IVsSettingsWriter интерфейс должен уникально идентифицировать каждый элемент данных, сохраненный в категории параметров.

      Примечание

      Имена должны быть уникальными в пределах области реализующего класса.Интегрированная среда разработки использует идентификатор GUID класса, реализующего параметры и значения pszSettingName сохраненный идентифицировать каждый параметр.Если несколько объектов IVsSettingsWriter метод, имеющий одинаковые pszSettingName вызывается значение, исходное значение перезаписывается в файле параметров.

    • Файл параметров поддерживает случайный доступ к данным, поэтому порядок операций чтения и записи не важен. В следующем примере порядок операций писателя в реализации LoadSettingsFromXml метод является обратным по отношению к операций чтения SaveSettingsToXml метод.

    • Если реализация может данные карты в один из поддерживаемых форматов 4, отсутствие ограничений на объем или каком тип данных можно записать.

      Примечание

      Разделение между труда SaveSettingsToXml и LoadSettingsFromStorage реализация зависит от методов и несколько произвольны.Например, реализация может быть перезаписана посредством пустой реализации SaveSettingsToXml метод и все запросы выполняются в реестре и состояния LoadSettingsFromStorage метод.

  4. Зарегистрируйте параметры, реализующий класс как поддержку 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 
    

    В этом случае атрибут сообщает интегрированную среду разработки, MyPackageProfileManager класс предоставляет реализацию параметров MyPackage класс. Пользовательский пункт параметры в реестре создается в разделе реестра " HKLM \ software \ microsoft \ VisualStudio \Версия\ \ CoreUI_MyPackage, где UserSettings Версия версия Visual Studio, например 10,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 data is obtained 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 

Convert C# to VB.NET
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 data is obtained 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);
            }
          }
        }
      }
    }
  }
}

См. также

Задачи

Практическое руководство. Параметры импорта с помощью MPF

Ссылки

IProfileManager

IVsSettingsWriter

Основные понятия

Сохранение параметров