Condividi tramite


Procedura: Esporta impostazioni utilizzando il pacchetto gestito Framework

L'ambiente di sviluppo integrato di (IDE) Visual Studio utilizza le classi che implementano l'interfaccia e le classi di IProfileManager registrate come supporto a quella specificata di un VSPackage per salvare lo stato di un VSPackage.

Poiché l'ide crea un'istanza di una classe che implementa l'interfaccia di IProfileManager per supportare le impostazioni, IProfileManager deve essere implementato in una classe indipendente.

Nota

Non distribuire IProfileManager sulla classe che implementa Package.

Per implementare l'esportazione delle impostazioni

  1. Dichiarare una classe che implementa le impostazioni di Visual Studio .

    Dichiarare una classe come implementare l'interfaccia di IProfileManager e fornirla a un GUID.

    Nota

    Le classi che implementano IProfileManager deve implementare anche IComponent.Questa operazione può essere eseguita derivando una classe da Component.

    Di seguito è riportato un esempio:

    [Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")]
    internal class MyPackageProfileManager : Component, IProfileManager 
    
  2. Verificare che la classe che implementa le impostazioni ottiene le informazioni sullo stato corrette. Questa procedura è specifica di ogni package VS e può includere ottenere lo stato da automazione, eseguire una query sulle chiavi del Registro di sistema, o interrogare il package VS.

    In genere, come nell'esempio seguente, utilizzare l'implementazione del metodo di LoadSettingsFromStorage per convalidare e appoggio delle informazioni sullo stato di un VSPackage.

    Nota

    Il metodo di LoadSettingsFromStorage viene chiamato dall'IDE quando si inizializza il package VS che supporta.

    In questo caso, l'implementazione del metodo di LoadSettingsFromStorage effettuare queste operazioni:

    • Ottiene l'accesso alle informazioni sullo stato nella configurazione e le informazioni di configurazione correnti di un VSPackage archiviate nel Registro di sistema.

      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;
      
    • A seconda del valore restituito dal metodo di MakeCurrentSettingTheDefault del package VS, aggiorna le impostazioni del Registro di sistema utilizzando lo stato corrente di package VS, lo stato o tramite le impostazioni del Registro di sistema.

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

      Per semplicità in questo esempio, a meno che il metodo di MakeCurrentSettingsTheDefault restituisca true, lo stato corrente viene reimpostato sempre predefiniti che viene memorizzato nel Registro di sistema.

  3. Verificare che la classe che implementa le impostazioni anche mantiene lo stato su disco.

    Effettiva scrittura di informazioni sullo stato del file su disco delle impostazioni venga sempre eseguita dall'implementazione della classe del metodo di SaveSettingsToXml . Le specifiche di un'operazione del writer delle impostazioni dipendono da essa.

    Tuttavia, la classe deve accedere alle informazioni sullo stato e deve utilizzare l'interfaccia fornita di IVsSettingsWriter per salvare i dati nel file dell'impostazione.

    In genere, come nell'esempio, l'implementazione del metodo di SaveSettingsToXml non convalida le informazioni sullo stato. La convalida viene eseguita nel metodo di LoadSettingsFromStorage . Invece, l'implementazione solo ottiene l'accesso alle informazioni sullo stato e lo scrive, in questo caso, in formato stringa.

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

    I dettagli di implementazione sono le seguenti:

    • Oltre ai dati esplicitamente scritti eimplementazione del metodo di ExportSettings , le API inoltre salva le informazioni sulla versione di Visual Studio . Di conseguenza, le impostazioni salvate possono essere si confrontano alla versione dell'IDE che le ha generate durante l'importazione delle impostazioni.

    • Il valore dell'argomento di pszSettingName assegnato a un metodo di interfaccia di IVsSettingsWriter necessario identificare in modo univoco ogni elemento dati salvato in una categoria di impostazioni.

      Nota

      I nomi devono essere univoci solo nella classe di implementazione.L'ide utilizza il GUID della classe che implementa le impostazioni e il valore di pszSettingName per identificare ogni impostazione salvata.Se più di un metodo di IVsSettingsWriter con lo stesso valore di pszSettingName viene chiamato, il valore originale viene sovrascritto nel file di impostazioni.

    • Il file di impostazioni supporta l'accesso ai dati casuali, pertanto l'ordine delle operazioni di lettura e scrittura non è importante. Nell'esempio seguente, l'ordine delle operazioni del writer nell'implementazione del metodo di SaveSettingsToXml rappresenta l'opposto di operazioni di lettura nel metodo di LoadSettingsFromXml .

    • Se l'implementazione può dati di mapping in uno dei quattro formati supportati, pertanto non è la restrizione su o sul tipo di dati possono essere scritti.

      Nota

      La suddivisione del lavoro tra LoadSettingsFromStorage e i metodi di SaveSettingsToXml dipenderà da ed è in qualche modo arbitrario.Ad esempio, l'implementazione potrebbe essere riscritta utilizzando un'implementazione vuota del metodo di LoadSettingsFromStorage e facendo tutti i eseguire il Registro di sistema e query dello stato nel metodo di SaveSettingsToXml .

  4. Registrare le impostazioni che implementano la classe come fornire supporto in un VSPackage.

    Applicare un'istanza di ProvideProfileAttribute costruita utilizzando Type della classe che implementa IProfileManager implementazione di un 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 
    

    In questo caso, l'attributo all'IDE che la classe di MyPackageProfileManager fornisce un'implementazione delle impostazioni alla classe di MyPackage . Il passaggio di impostazioni personalizzato nel Registro di sistema viene creato in \Software\Microsoft\VisualStudio HKLM \versione\UserSettings\ CoreUI_MyPackage, dove versione è la versione di Visual Studio, ad esempio, 10,0.

    Per ulteriori informazioni, vedere Rendere persistenti le impostazioni e ProvideProfileAttribute.

Esempio

Nell'esempio seguente viene implementato IProfileManager su una classe.

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

Vedere anche

Attività

Procedura: Impostazioni di importazione tramite il pacchetto gestito Framework

Riferimenti

IProfileManager

IVsSettingsWriter

Concetti

Rendere persistenti le impostazioni