Visual Studio 集成 (IDE)开发环境 (ide) 使用实现 IProfileManager 接口和类注册为支持给定查询 VSPackage 实现保存 VSPackage 状态的类。
由于 IDE 实例化实现 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 方法由 IDE 还调用,或者初始化它所支持的 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;
使用注册表设置,基于值在 VSPackage 返回,它将 MakeCurrentSettingTheDefault 方法更新使用当前 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 版本信息。 因此,保存的设置可以向设置导入时生成它们 IDE 的版本进行比较。
pszSettingName 参数的值提供给 IVsSettingsWriter 接口的方法必须唯一标识在设置类别保存的每个数据元素。
备注
名称必须是唯一的仅在实现类的范围内。IDE 使用实现一组和 pszSettingName 的值标识每个已保存的设置类的 GUID。如果多个具有相同 pszSettingName 值的一个 IVsSettingsWriter 方法调用,则原始值在设置文件复盖。
设置文件支持随机数据访问,因此,读取和写入操作顺序并不重要。 在下面的示例中,编写器操作的顺序。 SaveSettingsToXml 方法的实现了读取操作的相反值在 LoadSettingsFromXml 方法的。
如果实现可以将数据添加到四个支持的格式之一,则不会对数以及类型的限制数据进行编写。
备注
操作的工作划分在 LoadSettingsFromStorage 和 SaveSettingsToXml 方法之间的依赖于实现是某些任意的。例如,实现会复盖使用 LoadSettingsFromStorage 方法的一个空的实现以及由包含在 SaveSettingsToXml 方法执行的任何注册表和状态查询。
实现类的设置为提供支持。 VSPackage 中注册。
将构造通过使用某个类 Type 到 VSPackage Package 实现的实现 IProfileManagerProvideProfileAttribute 的实例。
<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 \版本\UserSettings\ CoreUI_MyPackage 下,其中 版本 是 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);
}
}
}
}
}
}
}