Сохранение свойства элемента проекта
Может потребоваться сохранить свойство, добавляемое в элемент проекта, например автор исходного файла. Это можно сделать, сохраняя свойство в файле проекта.
Первым шагом для сохранения свойства в файле проекта является получение иерархии проекта в качестве IVsHierarchy интерфейса. Этот интерфейс можно получить с помощью службы автоматизации или с помощью IVsMonitorSelection. После получения интерфейса его можно использовать для определения выбранного в данный момент элемента проекта. После получения идентификатора элемента проекта можно использовать SetItemAttribute для добавления свойства.
В следующих процедурах вы сохраняете свойство Author
VsPkg.cs со значением 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, а затем откройте или создайте решение.
Выберите элемент проекта VsPkg.cs в Обозреватель решений.
Используйте точку останова или иначе определите загрузку VSPackage и выполняется SetItemAttribute.
Примечание.
Вы можете автоматически загрузить VSPackage в контексте SolutionExists_guidпользовательского интерфейса. Дополнительные сведения см. в разделе Load VSPackages.
Закройте Visual Studio и откройте файл проекта в Блокнот. Вы должны увидеть <тег Author> со значением Tom следующим образом:
<Compile Include="VsPkg.cs"> <Author>Tom</Author> </Compile>