Partager via


Comment : Conserver la propriété d'un élément de projet

Vous pouvez rendre une propriété que vous ajoutez à un élément de projet, tel que l'auteur d'un fichier source. Vous pouvez le faire en stockant la propriété du fichier projet.

La première étape pour rendre une propriété dans un fichier projet consiste à obtenir la hiérarchie du projet comme une interface d' IVsHierarchy . Vous pouvez obtenir cette interface à l'aide de l'automation ou à l'aide de IVsMonitorSelection. Une fois que l'interface, vous pouvez l'utiliser pour déterminer quel élément de projet est actuellement sélectionné. Une fois que vous avez l'ID d'élément de projet, vous pouvez utiliser l' SetItemAttribute pour ajouter la propriété.

Dans les procédures suivantes, vous rendez persistantes la propriété auteur de VsPkg.cs avec la valeur Tom dans le fichier projet.

pour obtenir la hiérarchie de projet à l'aide de l'automation

  • Ajoutez le code suivant à votre 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);
    

Pour rendre la propriété d'un élément de projet à l'aide de l'automation

  • Ajoutez le code suivant à le code fourni dans la méthode dans la procédure précédente :

    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");
    }
    

Pour obtenir la hiérarchie de projet à l'aide de IVsMonitorSelection

  1. Ajoutez le code suivant à votre 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);
    }
    

Pour rendre la propriété sélectionnée d'élément de projet, dans la hiérarchie de projet

  • Ajoutez le code suivant à le code fourni dans la méthode dans la procédure précédente :

    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");
    }
    

Pour vérifier que la propriété est rendue persistante

  1. Le début Visual Studio puis ouvrez ou créez une solution.

  2. sélectionnez l'élément de projet VsPkg.cs dans Explorateur de solutions.

  3. Utilisez un point d'arrêt ou en déterminez sinon que votre VSPackage est chargé et que SetItemAttribute exécute.

    Notes

    vous pouvez charger automatiquement un VSPackage dans le contexte UICONTEXT_SolutionExistsd'interface utilisateur.Pour plus d'informations, consultez Comment : chargez automatiquement un VSPackage.

  4. Fermez Visual Studio puis ouvrez le fichier projet dans le Bloc-notes. Vous devez voir <Author> la balise avec la valeur Tom, comme suit :

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

Voir aussi

Autres ressources

Éléments de projet (kit de développement Visual Studio SDK)