다음을 통해 공유


방법: CodeModel 개체를 사용하여 C# 클래스 만들기

업데이트: 2007년 11월

CodeModel2 개체 계층에는 코드를 자동으로 생성하는 데 사용하는 완전한 메서드 집합이 있습니다. 대개는 코드를 직접 입력할 수 있지만 일부 프로세스를 자동화할 수도 있습니다. 자동화를 통해 다음과 같은 이점을 얻을 수 있습니다.

  • 명명 규칙을 적용합니다.

  • 문서화 표준을 적용합니다.

  • 표준화된 프로젝트를 만듭니다.

이 절차에서는 사용자가 추가 기능 프로젝트를 만드는 방법을 알고 있는 것으로 가정합니다. 자세한 내용은 추가 기능 및 마법사 만들기를 참조하십시오.

아래 절차를 수행하면 클래스가 새로운 소스 파일에 포함됩니다. 나중에 이 클래스에 메서드를 추가합니다.

참고:

표시되는 대화 상자와 메뉴 명령은 실제 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다. 이러한 절차는 일반 개발 설정을 사용하여 개발되었습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다. 자세한 내용은 Visual Studio 설정을 참조하십시오.

프로젝트에 새 소스 파일을 추가하려면

  1. Visual C#을 사용하여 Visual Studio 추가 기능 프로젝트를 만듭니다.

  2. 프로젝트 메뉴에서 참조 추가를 클릭하고 .NET 탭을 클릭한 다음 VSLangProj, VSLangProj2 및 VSLangProj80을 선택하고 확인을 클릭합니다.

  3. 다음 메서드 호출을 OnConnection 메서드에 추가합니다.

    public void OnConnection(object application, 
    ext_ConnectMode connectMode, object addInInst, ref Array custom)
    {
        _applicationObject = (DTE2)application;
        _addInInstance = (AddIn)addInInst;
        // Call the AddClass method.
        AddAClass(_applicationObject);
    }
    
  4. AddAClass 메서드를 OnConnection 메서드 바로 아래 추가합니다.

    public void AddAClass(DTE2 dte)
    {
    }
    
  5. 다음 코드를 AddAClass 메서드에 추가하여 프로젝트에 새로운 빈 코드 파일을 추가합니다.

    CodeFile 템플릿은 Visual Studio와 함께 설치되고 GetProjectItemTemplate 메서드를 사용하여 찾을 수 있습니다. 이 메서드는 검색하려는 언어 템플릿과 결과 프로젝트 항목의 파일 이름을 두 가지 매개 변수로 사용합니다. 프로젝트 항목은 AddFromTemplate 메서드를 사용하여 작성됩니다.

    proj = soln.Projects.Item(1); 코드를 실행하려면 이 예제를 실행하기 전에 Visual Studio IDE(통합 개발 환경)에 Visual C# 솔루션이 열려 있어야 합니다.

    Project proj;
    String csItemTemplatePath;
    Solution2 soln;
    soln = (Solution2)_applicationObject.Solution;
    // Open a C# solution in the Visual Studio IDE
    // before running this add-in.
    proj = soln.Projects.Item(1);
    ProjectItem pi;
    csItemTemplatePath = soln.GetProjectItemTemplate("CodeFile",
     "CSharp");
    proj.ProjectItems.AddFromTemplate(csItemTemplatePath, "MyFile.cs");
    pi = proj.ProjectItems.Item("MyFile.cs");
    

소스 파일에 네임스페이스를 추가하려면

  • 다음 코드를 추가하여 소스 파일에 네임스페이스를 추가합니다.

    FileCodeModel 속성에는 파일의 모든 코드 요소를 표시하는 FileCodeModel2 개체에 대한 참조가 들어 있습니다. FileCodeModel2 개체에는 코드 요소를 소스 파일에 추가하는 데 사용하는 몇 가지 메서드가 있습니다. AddNamespace 메서드는 CodeNamespace 개체를 반환합니다. 이 CodeNamespace 참조를 사용하여 소스 코드에 클래스 정의를 추가합니다.

    FileCodeModel2 fcm = (FileCodeModel2)pi.FileCodeModel;
    CodeNamespace games;
    

네임스페이스에 클래스를 추가하려면

  • AddClass 메서드를 사용하여 Chess 클래스를 Games 네임스페이스에 추가합니다. 클래스에 속성과 메서드를 추가하는 데 사용할 수 있는 CodeClass 인스턴스에 대한 참조가 AddClass 메서드에서 반환됩니다.

    games = fcm.AddNamespace("Games", -1);
    CodeClass2 chess;
    

메서드를 정의하려면

  • AddFunction 메서드를 사용하여 Move 메서드를 Chess 클래스에 추가합니다. 메서드의 첫 번째 인수에는 생성되는 함수의 이름을 지정합니다. AddFunction 메서드를 사용할 때 연산자와 생성자도 추가되므로 두 번째 인수에는 생성되는 함수의 형식을 지정합니다. 함수의 반환 형식을 지정하는 세 번째 인수는 메서드 시그니처으로 바뀝니다.

    if (games != null)
    {
        // Add a class to the namespace.
        chess = (CodeClass2)games.AddClass("Chess", -1, null, null,
     vsCMAccess.vsCMAccessDefault);
        // Add a method with a parameter to the class.
        CodeFunction2 move;
        move = (CodeFunction2)chess.AddFunction("Move",
     vsCMFunction.vsCMFunctionFunction,
     "int", -1, vsCMAccess.vsCMAccessDefault, null);
        move.AddParameter("IsOK", "bool", -1);
    }
    

    이 단계를 수행하면 아래와 같은 소스 파일이 생성됩니다.

    namespace Games
    {
        class Chess
        {
            int Move(bool IsOK)
            {
                return default(int);
            }
        }
    }
    

    추가 기능 코드는 다음과 같습니다.

    public void OnConnection(object application, ext_ConnectMode connectMode, 
    object addInInst, ref Array custom)
    {
        _applicationObject = (DTE2)application;
        _addInInstance = (AddIn)addInInst;
        // Call the AddClass method.
        AddAClass(_applicationObject);
    }
    public void AddAClass(DTE2 dte)
    {
        Project proj;
        String csItemTemplatePath;
        Solution2 soln;
        soln = (Solution2)_applicationObject.Solution;
        // Open a C# solution in the Visual Studio IDE
        // before running this add-in.
        proj = soln.Projects.Item(1);
        ProjectItem pi;
        csItemTemplatePath = soln.GetProjectItemTemplate("CodeFile", "CSharp");
        proj.ProjectItems.AddFromTemplate(csItemTemplatePath, "MyFile.cs");
        pi = proj.ProjectItems.Item("MyFile.cs");
        FileCodeModel2 fcm = (FileCodeModel2)pi.FileCodeModel;
        CodeNamespace games;
        try
        {
            // Add a namespace.
            games = fcm.AddNamespace("Games", -1);
            CodeClass2 chess;
            if (games != null)
            {
                // Add a class to the namespace.
                chess = (CodeClass2)games.AddClass("Chess", -1, null, null, 
    vsCMAccess.vsCMAccessDefault);
                // Add a method with a parameter to the class.
                CodeFunction2 move;
                move = (CodeFunction2)chess.AddFunction("Move", 
    vsCMFunction.vsCMFunctionFunction, "int", -1,
     vsCMAccess.vsCMAccessDefault, null);
                move.AddParameter("IsOK", "bool", -1);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Failed to add a code model element, because " 
    + ex.Message);
        }
    }
    
    Public Sub OnConnection(ByVal application As Object, _
     ByVal connectMode As ext_ConnectMode, ByVal addInInst As Object, _
     ByRef custom As Array) Implements IDTExtensibility2.OnConnection
        _applicationObject = CType(application, DTE2)
        _addInInstance = CType(addInInst, AddIn)
        AddAClass(_applicationObject)
    End Sub
    
    Public Sub AddAClass(ByVal dte As DTE2)
        Dim proj As Project
        Dim csItemTemplatePath As String
        Dim soln As Solution2
        soln = CType(_applicationObject.Solution, Solution2)
        ' Open a C# solution in the Visual Studio IDE before
        ' running this add-in.
        proj = soln.Projects.Item(1)
    
        Dim pi As ProjectItem
        csItemTemplatePath = soln.GetProjectItemTemplate("CodeFile", "CSharp")
        proj.ProjectItems.AddFromTemplate(csItemTemplatePath, "MyFile34.cs")
        pi = proj.ProjectItems.Item("MyFile34.cs")
        Dim fcm As FileCodeModel2 = CType(pi.FileCodeModel, FileCodeModel2)
        Dim games As CodeNamespace
        Try
            ' Add a namespace.
            games = fcm.AddNamespace("Games")
            Dim chess As CodeClass2
            If Not games Is Nothing Then
                ' Add a class to the namespace.
                chess = CType(games.AddClass("Chess"), CodeClass2)
                ' Add a method with a parameter to the class.
                Dim move As CodeFunction2
                move = CType(chess.AddFunction("Move", vsCMFunction.vsCMFunctionFunction, _
                "int"), CodeFunction2)
                move.AddParameter("IsOK", "bool")
            End If
        Catch e As Exception
            MsgBox("Failed to add a code model element, because " & _
            e.ToString())
        End Try
    End Sub
    

    OnConnection 클래스의 코드를 위 예제 코드로 바꿉니다. 이 예제를 실행하는 방법에 대한 자세한 내용은 방법: 추가 기능 관리자를 사용하여 추가 기능 제어를 참조하십시오.

참고 항목

작업

방법: CodeModel 개체를 사용하여 Visual Basic 코드 분석

개념

Visual Basic 및 C# 응용 프로그램에 대한 CodeModel 개체 개요

코드 모델을 사용하여 코드 검색(Visual Basic)

코드 모델을 사용하여 코드 검색(Visual C#)