保留项目项的属性

你可能想要保留添加到项目项的属性,例如源文件的作者。 可以通过将属性存储在项目文件中来执行此操作。

在项目文件中保存属性的第一步是获取项目的层次结构作为 IVsHierarchy 接口。 可以使用自动化或使用 IVsMonitorSelection. 获取接口后,可以使用它来确定当前选择了哪个项目项。 获得项目项 ID 后,可以使用 SetItemAttribute 该属性添加属性。

在以下过程中,你将使用项目文件中的值Tom保留 VsPkg.cs 属性Author

使用 DTE 对象获取项目层次结构

  1. 将以下代码添加到 VSPackage:

    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);
    

使用 DTE 对象保留项目项属性

  1. 将以下代码添加到上一过程中方法中给定的代码:

    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");
    }
    

使用 IVsMonitorSelection 获取项目层次结构

  1. 将以下代码添加到 VSPackage:

    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);
    }
    

若要保留所选项目项属性,请给定项目层次结构

  1. 将以下代码添加到上一过程中方法中给定的代码:

    IVsBuildPropertyStorage buildPropertyStorage =
        hierarchy as IVsBuildPropertyStorage;
    if (buildPropertyStorage != null)
    {
        buildPropertyStorage.SetItemAttribute(itemId, "Author", "Tom");
    }
    

验证属性是否持久化

  1. 启动 Visual Studio,然后打开或创建解决方案。

  2. 在 解决方案资源管理器 中选择项目项 VsPkg.cs。

  3. 使用断点或确定 VSPackage 已加载并且 SetItemAttribute 运行。

    注意

    可以在 UI 上下文 SolutionExists_guid中自动加载 VSPackage。 有关详细信息,请参阅 加载 VSPackages

  4. 关闭 Visual Studio,然后在记事本中打开项目文件。 应会看到 <具有 Tom 值的 Author> 标记,如下所示:

    <Compile Include="VsPkg.cs">
        <Author>Tom</Author>
    </Compile>