Compartilhar via


Como: manter a propriedade de um Item de projeto

Você talvez queira persistir uma propriedade que você adiciona a um item de projeto, como, por exemplo, o autor de um arquivo de origem. Você pode fazer isso, armazenando a propriedade no arquivo de projeto.

A primeira etapa para manter uma propriedade em um arquivo de projeto é obter a hierarquia do projeto como um IVsHierarchy interface. Você pode obter essa interface através da automatização ou usando IVsMonitorSelection. Depois que você obter a interface, você pode usá-lo para determinar qual item do projeto está selecionado no momento. Depois de ter a identificação de item de projeto, você pode usar SetItemAttribute para adicionar a propriedade.

Nos procedimentos a seguir, você pode manter a propriedade VsPkg.cs autor com o valor Tom no arquivo de projeto.

Para obter a hierarquia do projeto usando a automação

  • Adicione o seguinte código ao seu VSPackage:

    Dim dte As EnvDTE.DTE = CType(Package.GetGlobalService(GetType(EnvDTE.DTE)), EnvDTE.DTE)
    Dim project As EnvDTE.Project = dte.Solution.Projects.Item(1)
    
    Dim uniqueName As String = project.UniqueName
    Dim solution As IVsSolution = CType(Package.GetGlobalService(GetType(SVsSolution)), IVsSolution)
    Dim hierarchy As IVsHierarchy
    solution.GetProjectOfUniqueName(uniqueName, hierarchy)
    
    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 manter a propriedade de item de projeto por meio de automação

  • Adicione o seguinte código para o código fornecido no método no procedimento anterior:

    Dim buildPropertyStorage As IVsBuildPropertyStorage = CType(hierarchy, IVsBuildPropertyStorage)
    If Not buildPropertyStorage Is Nothing Then 
        Dim itemId As UInteger 
        Dim fullPath As String = CType(project.ProjectItems.Item("VsPkg.vb").Properties.Item("FullPath").Value, String)
        hierarchy.ParseCanonicalName(fullPath, itemId)
        buildPropertyStorage.SetItemAttribute(itemId, "Author", "Tom")
    End If
    
    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 o IVsMonitorSelection

  1. Adicione o seguinte código ao seu VSPackage:

    Dim hierarchy As IVsHierarchy = Nothing 
    Dim hierarchyPtr As IntPtr = IntPtr.Zero
    Dim selectionContainer As IntPtr = IntPtr.Zero
    Dim itemId As UInteger 
    
    ' Retrieve shell interface in order to get current selection 
    Dim monitorSelection As IVsMonitorSelection = CType(Package.GetGlobalService(GetType(SVsShellMonitorSelection)), IVsMonitorSelection)
    If monitorSelection Is Nothing Then 
        Throw New InvalidOperationException
    End If 
    
    Try 
        ' Get the current project hierarchy, project item, and selection container for the current selection 
        ' If the selection spans multiple hierarchies, hierarchyPtr is Zero 
        Dim multiItemSelect As IVsMultiItemSelect = Nothing
        ErrorHandler.ThrowOnFailure(monitorSelection.GetCurrentSelection(
                                    hierarchyPtr, itemId, multiItemSelect, selectionContainer))
    
        ' We only care if there is only one node selected in the tree 
        If Not (itemId = VSConstants.VSITEMID.Nil _
                Or hierarchyPtr = IntPtr.Zero _
                Or (Not multiItemSelect Is Nothing) _
                Or itemId = VSConstants.VSITEMID.Selection) Then
            hierarchy = CType(Marshal.GetObjectForIUnknown(hierarchyPtr), IVsHierarchy)
        End If 
    Finally 
        If hierarchyPtr <> IntPtr.Zero Then
            Marshal.Release(hierarchyPtr)
        End If 
        If selectionContainer <> IntPtr.Zero Then
            Marshal.Release(selectionContainer)
        End If 
    End Try
    
    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 hierachies, 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 manter a propriedade de item de projeto selecionado, dada a hierarquia do projeto

  • Adicione o seguinte código para o código fornecido no método no procedimento anterior:

    Dim buildPropertyStorage As IVsBuildPropertyStorage = CType(hierarchy, IVsBuildPropertyStorage)
    If Not buildPropertyStorage Is Nothing Then
        buildPropertyStorage.SetItemAttribute(itemId, "Author", "Tom")
    End If
    
    IVsBuildPropertyStorage buildPropertyStorage =
        hierarchy as IVsBuildPropertyStorage;
    if (buildPropertyStorage != null)
    {
        buildPropertyStorage.SetItemAttribute(itemid, "Author", "Tom");
    }
    

Para verificar que a propriedade é persistente

  1. Iniciar Visual Studio e, em seguida, abrir ou criar uma solução.

  2. Selecione o projeto do item VsPkg.cs na Solution Explorer.

  3. Use um ponto de interrupção ou caso contrário, determinar que seu VSPackage é carregado e que SetItemAttribute é executado.

    Dica

    É possível autoload VSPackage no contexto da interface do usuário UICONTEXT_SolutionExists.Para obter mais informações, consulte Como: Autoload VSPackage.

  4. Fechar Visual Studio e, em seguida, abra o arquivo de projeto no bloco de notas. Você deve ver o <Author> marca com o valor de Tom, da seguinte maneira:

    <Compile Include="VsPkg.cs">
        <Author>Tom</Author>
    </Compile>
    

Consulte também

Outros recursos

Itens de projeto (Visual Studio SDK)