持續保存專案項目的屬性
您可能想要持續保存新增至專案項目的屬性,例如來源檔案的作者。 您可以將屬性儲存在專案檔中以執行此動作。
持續保存專案檔中屬性的第一個步驟是取得專案階層做為 IVsHierarchy 介面。 您可以使用自動化或使用 IVsMonitorSelection來取得此介面。 取得介面之後,您可以使用介面來判斷目前選取的專案項目。 擁有專案項目識別碼後,就可以使用 SetItemAttribute 來新增屬性。
在下列程序中,您會將 VsPkg.cs 屬性Author
和值 Tom
持續保存在專案檔中。
使用 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,然後打開或建立解決方案。
在 [方案總管] 中,選取專案項目 item VsPkg.cs。
使用斷點,否則確定 VSPackage 已載入,且 SetItemAttribute 會執行。
注意
您可以在 UI 內容 SolutionExists_guid中自動載入 VSPackage。 如需詳細資訊,請參閱載入 VSPackages。
關閉 Visual Studio,然後在記事本中開啟專案檔。 您應該會看到具有 Tom 值的 [作者]<> 索引標籤,如下所示:
<Compile Include="VsPkg.cs"> <Author>Tom</Author> </Compile>