Практическое руководство. Экспорт параметров с помощью MPF
Visual Studio интегрированная среда разработки (ide) использует классы, реализующие IProfileManager интерфейс и классы, которые зарегистрированы как обслуживать заданный реализацию VSPackage, чтобы сохранить состояние VSPackage.
Поскольку создает интегрированной среды разработки класс, реализующий IProfileManager интерфейс для поддержки параметров IProfileManager быть реализовано в независимом классе.
Примечание
Не реализуйте IProfileManager в классе, который реализует Package.
Реализовать экспорт параметров
Объявите класс, реализующий Visual Studio параметры.
Объявите класс как реализация IProfileManager интерфейс и предоставляет его с GUID.
Примечание
Классы, реализующие IProfileManager должны также реализует IComponent.Это делается путем наследования от класса Component.
Примеры.
[Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")] internal class MyPackageProfileManager : Component, IProfileManager
Убедитесь, что класс, который реализует параметры возвращает правильные сведения о состоянии. Эта процедура относится к каждому 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текущее состояние всегда было сброшено значение по умолчанию, которое хранится в реестре.
Убедитесь, что класс, реализующий эти параметры также сохраняет состояние на диск.
Фактическая запись сведений о состоянии в файл на диске параметров всегда должна быть выполнена реализацией класса 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 метод.
Зарегистрируйте параметры, реализующий класс как поддержку 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