방법: Visual C++ 프로젝트 모델을 사용하여 프로젝트 조작

다음 절차에서는 Microsoft.VisualStudio.ProjectEngine.dll을 통해 제공되는 일부 프로젝트 모델 개체에서 Visual C++ 프로젝트에 대한 정보를 찾는 방법을 보여줍니다. 이 어셈블리는 컴파일러, 링커 및 기타 빌드 도구의 기능과 Visual C++ 프로젝트의 속성 페이지 대화 상자 기능을 모두 표시합니다.

내 명령 이름이라는 메뉴 명령이 있는 TestVCProjectPackage라는 VSPackage에 다음 절차의 코드를 통합할 수 있습니다. 이를 수행하는 방법에 대한 자세한 내용은 Visual Studio 패키지 템플릿을 사용 하 여 연습: 메뉴 명령 만들기을 참조하십시오.

VCProjectEngine을 사용하여 Visual C++ 프로젝트를 조작하려면

  1. 확장 탭에서 Microsoft.VisualStudio.VCCodeModel에 대한 참조를 추가하고 프레임워크 탭에서 System.Windows.Forms에 대한 참조를 추가합니다.

  2. 다음 using 문을 TestVCProjectPackagePackage.cs 파일에 추가합니다.

    using EnvDTE;
    using EnvDTE80;
    using EnvDTE90;
    using EnvDTE100;
    using Microsoft.VisualStudio.VCCodeModel;
    using System.Windows.Forms;
    
  3. MenuItemCallback 메서드에서 기존 코드를 제거하고 응용 프로그램 개체(여기서는 DTE2)를 가져오는 코드를 이 메서드에 추가합니다.

    private void MenuItemCallback(object sender, EventArgs e)
    {
        DTE2 dte2 = (DTE2)GetService(typeof(DTE));
    }
    
  4. 같은 메서드에서 열린 프로젝트를 가져옵니다. 프로젝트가 실제로 열려 있는지 확인해야 합니다.

    private void MenuItemCallback(object sender, EventArgs e) 
    {
        DTE2 dte2 = (DTE2)GetService(typeof(DTE));
    
        VCProject prj; 
        Projects projColl = dte2.Solution.Projects; 
    
        if (projColl.Count == 0) 
        {
            MessageBox.Show("You must have a project open in the experimental instance."); 
            return; 
        }
        if (projColl.Count > 0) 
        {
            // to be filled in later
        }
    }
    
  5. 열린 프로젝트를 가져온 다음 프로젝트 구성을 검사합니다.

    private void MenuItemCallback(object sender, EventArgs e)
    {
        DTE2 dte2 = (DTE2)GetService(typeof(DTE));
    
        VCProject prj;
        VCAssemblyReference vcar;
        int idx;
        IVCCollection mycollection, mycollection2;
        VCConfiguration cfg;
        String sTest = "Configuration Information:" + "\n";
        VCFile file;
        try
        {   
            Projects projColl = dte2.Solution.Projects;
    
            if (projColl.Count == 0)
            {
                MessageBox.Show("You must have a project open in the experimental instance.");
                return;
            }
            if (projColl.Count > 0)
            {
                prj = (VCProject)dte2.Solution.Projects.Item(1).Object;
                if (prj.CanAddAssemblyReference(@"%VSINSTALLDIR%\Common7\IDE\PublicAssemblies\VSLangProj.dll"))
                    {  
                        vcar = (VCAssemblyReference)prj.AddAssemblyReference(@"%VSINSTALLDIR%\Common7\IDE\PublicAssemblies\VSLangProj.dll");
                        MessageBox.Show("The assembly named" + vcar.AssemblyName + " was added.");
                    }
                mycollection = (IVCCollection)prj.Configurations;
                MessageBox.Show("Number of configurations in the project : " + mycollection.Count);
                for (idx = 1; idx <= mycollection.Count; idx++)
                {
                    cfg = (VCConfiguration)mycollection.Item(idx);
                    sTest = sTest + "Configuration name: " + cfg.Name + "\n" 
                     + "Platform: " + "\n" + cfg.Platform.ToString() + "\n" 
                     + "Program database: \n" + cfg.ProgramDatabase + "\n";
                }
                MessageBox.Show(sTest);
                mycollection2 = (IVCCollection)prj.Files;
                MessageBox.Show("Number of files in the project: " + mycollection2.Count);
            }
        }
        catch (SystemException ex)
        {
            MessageBox.Show("ERROR: " + ex.ToString());
        }
    }
    
  6. 솔루션을 빌드하고 디버깅을 시작합니다. 두 번째 Visual Studio 인스턴스가 표시됩니다. 이 인스턴스를 실험적 인스턴스라고 합니다.

  7. 실험적 인스턴스에서 Visual C++ 프로젝트를 엽니다.

  8. 도구 메뉴에서 내 명령 이름을 클릭합니다.

    명령 코드가 VSLangProj.dll에 대한 참조를 추가하고 VCAssemblyReference 개체를 사용하여 해당 파일에 대한 정보를 표시합니다. 또한 VCConfiguration 개체를 사용하여 모든 구성 이름을 열거하고 표시합니다. VCFile을 사용하여 Visual C++ 프로젝트에 있는 파일 확장명을 표시합니다. VCProjectIVCCollection 개체를 사용하여 프로젝트를 Visual C++ 프로젝트로 선언하고 구성 및 파일 컬렉션을 열거합니다.

참고 항목

개념

Visual C++ 프로젝트 모델

Visual C++ 코드 모델

기타 리소스

Visual C++ 확장성 개체 모델

Visual C++ 마법사 모델