Freigeben über


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

  1. 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

  1. Erste Schritte Visual Studio und dann eine Projektmappe öffnen oder erstellen.

  2. Wählen Sie das Projektelement in VsPkg.cs Projektmappen-Exploreraus.

  3. 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.

  4. 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>
    

Siehe auch

Weitere Ressourcen

Projektelemente (Visual Studio SDK)