Beibehalten der Eigenschaft eines Projektelements
Möglicherweise möchten Sie eine Eigenschaft beibehalten, die Sie einem Projektelement hinzufügen, z. B. den Autor einer Quelldatei. Dazu können Sie die Eigenschaft in der Projektdatei speichern.
Der erste Schritt zum Speichern einer Eigenschaft in einer Projektdatei besteht darin, die Hierarchie des Projekts als IVsHierarchy Schnittstelle abzurufen. Sie können diese Schnittstelle entweder mithilfe der Automatisierung oder mithilfe von IVsMonitorSelection. Nachdem Sie die Schnittstelle erhalten haben, können Sie sie verwenden, um zu bestimmen, welches Projektelement derzeit ausgewählt ist. Nachdem Sie über die Projektelement-ID verfügen SetItemAttribute , können Sie die Eigenschaft hinzufügen.
In den folgenden Verfahren speichern Sie die VsPkg.cs-Eigenschaft Author
mit dem Wert Tom
in der Projektdatei.
So rufen Sie die Projekthierarchie mit dem DTE-Objekt ab
Fügen Sie Ihrem VSPackage den folgenden Code hinzu:
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 speichern Sie die Projektelementeigenschaft mit dem DTE-Objekt
Fügen Sie dem code, der in der Methode im vorherigen Verfahren angegeben ist, den folgenden Code hinzu:
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"); }
So rufen Sie die Projekthierarchie mit IVsMonitorSelection ab
Fügen Sie Ihrem VSPackage den folgenden Code hinzu:
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 hierarchies, 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); }
So speichern Sie die ausgewählte Projektelementeigenschaft unter Berücksichtigung der Projekthierarchie
Fügen Sie dem code, der in der Methode im vorherigen Verfahren angegeben ist, den folgenden Code hinzu:
IVsBuildPropertyStorage buildPropertyStorage = hierarchy as IVsBuildPropertyStorage; if (buildPropertyStorage != null) { buildPropertyStorage.SetItemAttribute(itemId, "Author", "Tom"); }
So überprüfen Sie, ob die Eigenschaft beibehalten wird
Starten Sie Visual Studio, und öffnen Oder erstellen Sie eine Projektmappe.
Wählen Sie das Projektelement VsPkg.cs in Projektmappen-Explorer aus.
Verwenden Sie einen Haltepunkt oder bestimmen Sie andernfalls, dass Ihr VSPackage geladen wird und dass SetItemAttribute ausgeführt wird.
Hinweis
Sie können ein VSPackage im UI-Kontext SolutionExists_guidautomatisch laden. Weitere Informationen finden Sie unter Laden von VSPackages.
Schließen Sie Visual Studio, und öffnen Sie dann die Projektdatei in Editor. Das Author-Tag> mit dem Wert "Tom" sollte wie folgt angezeigt <werden:
<Compile Include="VsPkg.cs"> <Author>Tom</Author> </Compile>