Compartilhar via


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

  1. 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

  1. 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

  1. 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

  1. 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

  1. Inicie o Visual Studio e, em seguida, abra ou crie uma solução.

  2. Selecione o item de projeto VsPkg.cs no Gerenciador de Soluções.

  3. 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.

  4. 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>