방법: CodeModel 개체를 사용하여 C# 클래스 만들기
업데이트: 2007년 11월
CodeModel2 개체 계층에는 코드를 자동으로 생성하는 데 사용하는 완전한 메서드 집합이 있습니다. 대개는 코드를 직접 입력할 수 있지만 일부 프로세스를 자동화할 수도 있습니다. 자동화를 통해 다음과 같은 이점을 얻을 수 있습니다.
명명 규칙을 적용합니다.
문서화 표준을 적용합니다.
표준화된 프로젝트를 만듭니다.
이 절차에서는 사용자가 추가 기능 프로젝트를 만드는 방법을 알고 있는 것으로 가정합니다. 자세한 내용은 추가 기능 및 마법사 만들기를 참조하십시오.
아래 절차를 수행하면 클래스가 새로운 소스 파일에 포함됩니다. 나중에 이 클래스에 메서드를 추가합니다.
참고: |
---|
표시되는 대화 상자와 메뉴 명령은 실제 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다. 이러한 절차는 일반 개발 설정을 사용하여 개발되었습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다. 자세한 내용은 Visual Studio 설정을 참조하십시오. |
프로젝트에 새 소스 파일을 추가하려면
Visual C#을 사용하여 Visual Studio 추가 기능 프로젝트를 만듭니다.
프로젝트 메뉴에서 참조 추가를 클릭하고 .NET 탭을 클릭한 다음 VSLangProj, VSLangProj2 및 VSLangProj80을 선택하고 확인을 클릭합니다.
다음 메서드 호출을 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); }
AddAClass 메서드를 OnConnection 메서드 바로 아래 추가합니다.
public void AddAClass(DTE2 dte) { }
다음 코드를 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 개체 개요