共用方式為


持續保存專案項目的屬性

您可能想要持續保存新增至專案項目的屬性,例如來源檔案的作者。 您可以將屬性儲存在專案檔中以執行此動作。

持續保存專案檔中屬性的第一個步驟是取得專案階層做為 IVsHierarchy 介面。 您可以使用自動化或使用 IVsMonitorSelection來取得此介面。 取得介面之後,您可以使用介面來判斷目前選取的專案項目。 擁有專案項目識別碼後,就可以使用 SetItemAttribute 來新增屬性。

在下列程序中,您會將 VsPkg.cs 屬性Author和值 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. 在 [方案總管] 中,選取專案項目 item VsPkg.cs。

  3. 使用斷點,否則確定 VSPackage 已載入,且 SetItemAttribute 會執行。

    注意

    您可以在 UI 內容 SolutionExists_guid中自動載入 VSPackage。 如需詳細資訊,請參閱載入 VSPackages

  4. 關閉 Visual Studio,然後在記事本中開啟專案檔。 您應該會看到具有 Tom 值的 [作者]<> 索引標籤,如下所示:

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