Procedura: Mantenere la proprietà di un elemento di progetto
È possibile che si desideri mantenere una proprietà che si aggiunge a un elemento di progetto, l'autore di un file di origine. È possibile eseguire questa operazione archiviando la proprietà nel file di progetto.
Il primo passaggio per mantenere una proprietà in un file di progetto è di ottenere la gerarchia del progetto come interfaccia di IVsHierarchy . È possibile ottenere questa interfaccia utilizzando l'automazione o utilizzando IVsMonitorSelection. Una volta ottenuto l'interfaccia, è possibile utilizzarlo per determinare quale elemento di progetto attualmente selezionato. Once you have the project item ID, you can use SetItemAttribute to add the property.
Nelle procedure riportate di seguito, salvate in modo permanente la proprietà autore di VsPkg.cs con il valore Tom nel file di progetto.
Per ottenere la gerarchia del progetto utilizzando l'automazione
Aggiungere il codice seguente al package VS:
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);
Per mantenere la proprietà dell'elemento di progetto utilizzando l'automazione
Aggiungere il codice seguente al codice fornito nel metodo nella procedura precedente:
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"); }
Per ottenere la gerarchia del progetto tramite IVsMonitorSelection
Aggiungere il codice seguente al package VS:
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); }
Per mantenere la proprietà selezionata di elemento di progetto, in base alla gerarchia del progetto
Aggiungere il codice seguente al codice fornito nel metodo nella procedura precedente:
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"); }
Per verificare che la proprietà sia mantenuta
Visual Studio avviare quindi aprire o creare una soluzione.
selezionare l'elemento di progetto VsPkg.cs in Esplora soluzioni.
Utilizzare un punto di interruzione oppure determinare che il package VS viene caricato ed eseguito di SetItemAttribute.
Nota
È possibile carico automatico un VSPackage nel contesto UICONTEXT_SolutionExistsdell'interfaccia utente.Per ulteriori informazioni, vedere Procedura: carico automatico un VSPackage.
Chiudere Visual Studio quindi aprire il file di progetto in Blocco Note. Viene visualizzato il tag di <autore> con il valore Tom, come segue:
<Compile Include="VsPkg.cs"> <Author>Tom</Author> </Compile>