다음을 통해 공유


프로젝트 항목의 속성 유지

프로젝트 항목에 추가하는 속성(예: 원본 파일 작성자)을 유지할 수 있습니다. 프로젝트 파일에 속성을 저장하여 이 작업을 수행할 수 있습니다.

프로젝트 파일에서 속성을 유지하는 첫 번째 단계는 프로젝트의 계층 구조를 IVsHierarchy 인터페이스로 가져오는 것입니다. Automation을 사용하거나 IVsMonitorSelection을 사용하여 이 인터페이스를 가져올 수 있습니다. 인터페이스를 가져오면 해당 인터페이스를 사용하여 현재 선택된 프로젝트 항목을 확인할 수 있습니다. 프로젝트 항목 ID가 있으면 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. 솔루션 탐색기의 프로젝트 항목 VsPkg.cs를 선택합니다.

  3. 중단점을 사용하거나 VSPackage가 로드되고 SetItemAttribute가 실행되는지 확인합니다.

    참고 항목

    UI 컨텍스트 SolutionExists_guid에서 VSPackage를 자동으로 로드할 수 있습니다. 자세한 내용은 VSPackages 로드를 참조하세요.

  4. Visual Studio를 닫은 다음, 메모장에서 프로젝트 파일을 엽니다. 다음과 같이 Tom 값이 포함된 <Author> 태그가 표시됩니다.

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