保留项目项的属性
你可能想要保留添加到项目项的属性,例如源文件的作者。 可以通过将属性存储在项目文件中来执行此操作。
在项目文件中保存属性的第一步是获取项目的层次结构作为 IVsHierarchy 接口。 可以使用自动化或使用 IVsMonitorSelection. 获取接口后,可以使用它来确定当前选择了哪个项目项。 获得项目项 ID 后,可以使用 SetItemAttribute 该属性添加属性。
在以下过程中,你将使用项目文件中的值Tom
保留 VsPkg.cs 属性Author
。
使用 DTE 对象获取项目层次结构
将以下代码添加到 VSPackage:
EnvDTE.DTE dte = (EnvDTE.DTE)Package.GetGlobalService(typeof(EnvDTE.DTE)); EnvDTE.Project project = dte.Solution.Projects.Item(1); string uniqueName = project.UniqueName; IVsSolution solution = (IVsSolution)Package.GetGlobalService(typeof(SVsSolution)); IVsHierarchy hierarchy; solution.GetProjectOfUniqueName(uniqueName, out hierarchy);
使用 DTE 对象保留项目项属性
将以下代码添加到上一过程中方法中给定的代码:
IVsBuildPropertyStorage buildPropertyStorage = hierarchy as IVsBuildPropertyStorage; if (buildPropertyStorage != null) { uint itemId; string fullPath = (string)project.ProjectItems.Item( "VsPkg.cs").Properties.Item("FullPath").Value; hierarchy.ParseCanonicalName(fullPath, out itemId); buildPropertyStorage.SetItemAttribute(itemId, "Author", "Tom"); }
使用 IVsMonitorSelection 获取项目层次结构
将以下代码添加到 VSPackage:
IVsHierarchy hierarchy = null; IntPtr hierarchyPtr = IntPtr.Zero; IntPtr selectionContainer = IntPtr.Zero; uint itemid; // Retrieve shell interface in order to get current selection IVsMonitorSelection monitorSelection = Package.GetGlobalService(typeof(SVsShellMonitorSelection)) as IVsMonitorSelection; if (monitorSelection == null) throw new InvalidOperationException(); try { // Get the current project hierarchy, project item, and selection container for the current selection // If the selection spans multiple hierarchies, hierarchyPtr is Zero IVsMultiItemSelect multiItemSelect = null; ErrorHandler.ThrowOnFailure( monitorSelection.GetCurrentSelection( out hierarchyPtr, out itemid, out multiItemSelect, out selectionContainer)); // We only care if there is only one node selected in the tree if (!(itemid == VSConstants.VSITEMID_NIL || hierarchyPtr == IntPtr.Zero || multiItemSelect != null || itemid == VSConstants.VSITEMID_SELECTION)) { hierarchy = Marshal.GetObjectForIUnknown(hierarchyPtr) as IVsHierarchy; } } finally { if (hierarchyPtr != IntPtr.Zero) Marshal.Release(hierarchyPtr); if (selectionContainer != IntPtr.Zero) Marshal.Release(selectionContainer); }
若要保留所选项目项属性,请给定项目层次结构
将以下代码添加到上一过程中方法中给定的代码:
IVsBuildPropertyStorage buildPropertyStorage = hierarchy as IVsBuildPropertyStorage; if (buildPropertyStorage != null) { buildPropertyStorage.SetItemAttribute(itemId, "Author", "Tom"); }
验证属性是否持久化
启动 Visual Studio,然后打开或创建解决方案。
在 解决方案资源管理器 中选择项目项 VsPkg.cs。
使用断点或确定 VSPackage 已加载并且 SetItemAttribute 运行。
注意
可以在 UI 上下文 SolutionExists_guid中自动加载 VSPackage。 有关详细信息,请参阅 加载 VSPackages。
关闭 Visual Studio,然后在记事本中打开项目文件。 应会看到 <具有 Tom 值的 Author> 标记,如下所示:
<Compile Include="VsPkg.cs"> <Author>Tom</Author> </Compile>