Persistir a propriedade de um item de projeto
Talvez você queira manter uma propriedade adicionada a um item de projeto, como o autor de um arquivo de origem. Você pode fazer isso armazenando a propriedade no arquivo de projeto.
A primeira etapa para persistir uma propriedade em um arquivo de projeto é obter a hierarquia do projeto como uma IVsHierarchy interface. Você pode obter essa interface usando automação ou usando IVsMonitorSelection. Depois de obter a interface, você pode usá-la para determinar qual item de projeto está selecionado no momento. Depois de ter a ID do item de projeto, você pode usar SetItemAttribute para adicionar a propriedade.
Nos procedimentos a seguir, você persiste a propriedade Author
VsPkg.cs com o valor Tom
no arquivo de projeto.
Para obter a hierarquia do projeto com o objeto DTE
Adicione o seguinte código ao seu 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);
Para persistir a propriedade de item de projeto com o objeto DTE
Adicione o seguinte código ao código fornecido no método no procedimento anterior:
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"); }
Para obter a hierarquia do projeto usando IVsMonitorSelection
Adicione o seguinte código ao seu 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); }
Para persistir a propriedade de item de projeto selecionada, dada a hierarquia do projeto
Adicione o seguinte código ao código fornecido no método no procedimento anterior:
IVsBuildPropertyStorage buildPropertyStorage = hierarchy as IVsBuildPropertyStorage; if (buildPropertyStorage != null) { buildPropertyStorage.SetItemAttribute(itemId, "Author", "Tom"); }
Para verificar se a propriedade é persistente
Inicie o Visual Studio e, em seguida, abra ou crie uma solução.
Selecione o item de projeto VsPkg.cs no Gerenciador de Soluções.
Use um ponto de interrupção ou determine se o VSPackage está carregado e se SetItemAttribute é executado.
Observação
Você pode carregar automaticamente um VSPackage no contexto SolutionExists_guidda interface do usuário. Para obter mais informações, consulte Carregar VSPackages.
Feche o Visual Studio e, em seguida, abra o arquivo de projeto no bloco de notas. Você deve ver a <tag Author> com o valor Tom, da seguinte maneira:
<Compile Include="VsPkg.cs"> <Author>Tom</Author> </Compile>