Поделиться через


Сохранение свойства элемента проекта

Может потребоваться сохранить свойство, добавляемое в элемент проекта, например автор исходного файла. Это можно сделать, сохраняя свойство в файле проекта.

Первым шагом для сохранения свойства в файле проекта является получение иерархии проекта в качестве IVsHierarchy интерфейса. Этот интерфейс можно получить с помощью службы автоматизации или с помощью IVsMonitorSelection. После получения интерфейса его можно использовать для определения выбранного в данный момент элемента проекта. После получения идентификатора элемента проекта можно использовать SetItemAttribute для добавления свойства.

В следующих процедурах вы сохраняете свойство Author VsPkg.cs со значением Tom в файле проекта.

Получение иерархии проекта с помощью объекта 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.

    Примечание.

    Вы можете автоматически загрузить VSPackage в контексте SolutionExists_guidпользовательского интерфейса. Дополнительные сведения см. в разделе Load VSPackages.

  4. Закройте Visual Studio и откройте файл проекта в Блокнот. Вы должны увидеть <тег Author> со значением Tom следующим образом:

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