Freigeben über


Gewusst wie: Import-Einstellungen mithilfe von verwaltetem Paketframeworks

Die Visual Studio integrierte Entwicklungsumgebung (IDE) IProfileManager die Klassen, die die Schnittstelle implementieren und registriert sein, um eine VSPackage-Implementierung zu unterstützen. Diese Implementierung wird verwendet, um den Zustand von VSPackages abzurufen.

Da die IDE die Klasse instanziiert, die die IProfileManager-Schnittstelle implementiert, um die Visual Studio Einstellungen zu unterstützen, sollte die IProfileManager-Schnittstelle in einer unabhängigen Klasse implementiert werden.

Hinweis

Implementieren Sie nicht IProfileManager für die Klasse, die Packageimplementiert.

So implementieren Einstellungs-Export

  1. Deklarieren Sie die Klasse, die die Visual Studio Einstellungen implementiert.

    Deklarieren Sie eine Klasse als Implementieren von IProfileManager und stellen Sie sie mit GUID.

    Hinweis

    Die Klassen, die die IProfileManager-Schnittstelle implementieren, müssen auch die IComponent-Schnittstelle implementieren, die ausgeführt werden können, indem die Klasse von der Component-Klasse abgeleitet ist.

    Beispiele:

    [Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")]
    internal class MyPackageProfileManager : Component, IProfileManager 
    
  2. Stellen Sie sicher, dass die Klasse, die die Einstellungen implementiert, Zustandsdaten aus dem Datenträger abruft.

    Dieser Schritt wird ausgeführt, indem die LoadSettingsFromXml-Methode implementiert.

    Die genauen Informationen, die beibehalten werden sollen und wie diese Informationen von einem VSPackage abgerufen und gemarshallt werden, unterscheiden sich für jeden VSPackage.

    Unabhängig von der Informationen, die von einem VSPackage beibehalten werden soll, muss die Klasse, die IProfileManager implementiert wird, die angegebene IVsSettingsReader-Schnittstelle verwenden, um Daten aus der Einstellungsdatei abzurufen.

    Normalerweise, wie im nachfolgenden Beispiel wird überprüft LoadSettingsFromXml auch die abgerufenen Daten und aktualisiert den Zustand VSPackages.

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

    Implementierungsdetails:

    • Meldet Fehler wieder dem Benutzer interaktiv von der IDE mithilfe der ReportError-Methode der IVsSettingsReader-Schnittstelle:

      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");
        }
      
    • Vor tatsächlich gespeicherten Einstellungen abrufen, sollte eine Implementierung der LoadSettingsFromXml-Methode die ReadFileVersion-Methode verwenden, um diese Version von Visual Studio zu überprüfen, die die gespeicherten Einstellungen unterstützt wird, exportiert.

      Bei der Implementierung des Beispiels unten, überprüft, wenn Einstellungen von einer Version von Visual Studio mit der Hauptversionsnummer von m_supportVerund erzeugt einen Fehler, wenn nicht signalisiert.

      If pnMajor <> m_supportVer Then 
          reader.ReportError("Unsupported Version") 
      End If
      
      if (pnMajor != m_supportVer){
        reader.ReportError("Unsupported Version");
      }
      
    • Die Visual Studio Einstellungsdatei zufälligen Datenzugriff unterstützt. Daher ist die Reihenfolge der Vorgänge einstellungs Lese- und Writer nicht wichtig. Im nachstehenden Beispiel ist die Reihenfolge der Vorgänge Writer in der Implementierung der SaveSettingsToXml-Methode Umkehrung der Lesevorgänge in der LoadSettingsFromXml-Methode.

    • Der Wert des Arguments pszSettingName , das auf eine Methode der IVsSettingsWriter-Schnittstelle angegeben wird, muss jedes des Datenelements eindeutig bezeichnen, das in eine Einstellungskategorie gespeichert wird.

      Hinweis

      Namen dürfen nur im Kontext der implementierenden Klasse eindeutig sein, da die IDE die GUID der Klasse veranschaulicht, die die Einstellungen und den Wert pszSettingName implementiert, um jede gespeicherte Einstellung zu identifizieren.Wenn mehr als eine IVsSettingsWriter-Methode mit demselben Wert pszSettingNameaufgerufen wird, wird der ursprüngliche Wert in der Einstellungsdatei überschrieben.

  3. Stellen Sie die Kohärenz zwischen VSPackage-Zustand und lokal gespeicherten oder zwischengespeicherten Einstellungen sicher.

    Dieser Schritt ist normalerweise bei der Implementierung der SaveSettingsToStorage-Methode ausgeführt (wie im nachfolgenden Beispiel gezeigt wird). Die Details dieses Schritts und VSPackages umfassen bestimmt sind, kann der Zustand der Automatisierung von VSPackages zu erhalten, VSPackages abzufragen und Registrierungsschlüssel anzugeben.

    Hinweis

    Die LoadSettingsFromStorage-Methode sollte die Informationen abrufen, die durch die SaveSettingsToStorage-Methode gespeichert werden, wenn die LoadSettingsFromStorage-Methode von der IDE während ihrer Initialisierung VSPackages aufgerufen wird, die sie unterstützen.

    Im folgenden Beispiel implementiert die Klasse, die die Unterstützung von Einstellungen unterstützt, die SaveSettingsToStorage-Methode:

    • Rufen Sie Zugriff auf die VSPackages aktualisierten Zustandsinformationen.

      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;
      
    • Verwenden Sie diese Informationen, um die VSPackages Registrierungseinstellungen zu aktualisieren.

      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);
            }
          }
        }
      }
      
    • Hinweis

      Die Arbeitsteilung zwischen dem LoadSettingsFromXml und Methoden ist SaveSettingsToStorage hängt von der Implementierung und stellt ein wenig beliebigen.Zum Beispiel kann die Implementierung mit einer leeren Implementierung der Methode LoadSettingsFromStorage Registrierungs- und alle Zustände und Abfragen umgeschrieben werden, die in der SaveSettingsToXml-Methode ausgeführt wurden.

  4. Registrieren Sie die Klasse implementiert ist, die die Einstellungen, z. B. Unterstützung VSPackage gewährend.

    Wenden Sie eine Instanz von ProvideProfileAttribute erstellt hat, indem Sie Type der Klasse verwenden, die zur IProfileManager VSPackages Package Implementierung implementiert.

    <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 
    

    In diesem Fall teilt das Attribut über die IDE, dass die MyPackageProfileManager-Klasse eine Implementierung der Einstellungen zur MyPackage-Klasse bereitstellt. Der benutzerdefinierte Einstellungs-Punkt in der Registrierung wird unter HKLM \ Software \ Microsoft \ VisualStudio \ <Version> \ UserSettings \ CoreUI_MyPackage, wo <Version> die Version von Visual Studioist, z. B. 8.0 erstellt.

    Weitere Informationen finden Sie unter Beibehalten von Einstellungen und unter ProvideProfileAttribute.

Beispiel

Im folgenden Beispiel implementiert IProfileManager für eine Klasse.

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

Siehe auch

Aufgaben

Gewusst wie: und exportieren mithilfe von verwaltetem Paketframeworks

Referenz

IProfileManager

IVsSettingsWriter

Konzepte

Beibehalten von Einstellungen