Gewusst wie: Behalten Sie die Eigenschaft eines Projektelements an
Sie sollten eine Eigenschaft, die Sie einem Projektelement hinzu, z. B. dem Autor einer Quelldatei beibehalten. Dazu können Sie die Eigenschaft in der Projektdatei speichern.
Der erste Schritt, um eine Eigenschaft in einer Projektdatei beizubehalten ist, die Hierarchie des Projekts als IVsHierarchy-Schnittstelle zu erhalten. Sie können diese Schnittstelle abrufen, indem Sie entweder die Automatisierung verwenden oder indem Sie IVsMonitorSelectionverwenden. Nachdem Sie die Schnittstelle erhalten, können Sie sie verwenden, um zu bestimmen, welches Projektelement derzeit ausgewählt ist. Nachdem Sie das Projektelement ID haben, können Sie SetItemAttribute verwenden, um die Eigenschaft hinzuzufügen.
In den folgenden Prozeduren behalten Sie den VsPkg.cs-Eigenschaft Autor mit dem Wert Tom in der Projektdatei beibehalten.
Um die Projekthierarchie abgerufen durch Automatisierung
Fügen Sie den folgenden Code hinzu: ein 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);
So konfigurieren Sie die Text-Eigenschaft Projektelement durch Automatisierung beibehalten
Fügen Sie den folgenden Code dem Code hinzu, der in der Methode im vorhergehenden Verfahren angegeben ist:
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"); }
Um die Projekthierarchie mithilfe von IVsMonitorSelection erhalten
Fügen Sie den folgenden Code hinzu: ein 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); }
Um die ausgewählte Projektelement - Eigenschaft beibehalten, wenn die Projekthierarchie
Fügen Sie den folgenden Code dem Code hinzu, der in der Methode im vorhergehenden Verfahren angegeben ist:
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"); }
So überprüfen Sie, ob die Eigenschaft beibehalten wird
Erste Schritte Visual Studio und dann eine Projektmappe öffnen oder erstellen.
Wählen Sie das Projektelement in VsPkg.cs Projektmappen-Exploreraus.
Verwenden Sie einen Haltepunkt oder stellen Sie andernfalls sicher, dass VSPackages geladen wird und dass SetItemAttribute-Ausführungen.
Hinweis
Sie können in einem VSPackage Benutzeroberfläche-Kontext UICONTEXT_SolutionExistsautomatisch laden.Weitere Informationen finden Sie unter Gewusst wie: Automatisches Laden von VSPackages.
Schließen Sie Visual Studio , und öffnen Sie dann die Projektdatei in Editor. Sie sollten das <Author> Tag mit dem Wert Tom sehen wie folgt aus:
<Compile Include="VsPkg.cs"> <Author>Tom</Author> </Compile>