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
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
Le début Visual Studio puis ouvrez ou créez une solution.
sélectionnez l'élément de projet VsPkg.cs dans Explorateur de solutions.
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.
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>