2012-11-14 3 views
7

프로그래밍 방식으로 함수 (TestMethod)를 기존 C# 파일에 추가하려고합니다. Google 검색 후 도서관 EnvDTECodeModel.AddFunction -Method를 찾았지만 내가 원하는 것에 대한 좋은 예를 찾을 수 없습니다.EnvDTE를 사용하여 프로그래밍 방식으로 기존 C# 파일에 함수 추가

새로 작성한 함수와 속성에 이미 코드가있는 함수를 추가하고 싶습니다. 다음과 같이 입력하십시오 :

누구든지 나에게이 작업을 수행하는 방법에 대한 예제를 보여줄 수 있습니까?

EDIT : 텍스트 파일을 편집하는 것처럼 C# 파일을 편집하고 싶습니다. StreamWriter를 사용하여이 작업을 수행 할 수 있다는 것을 알고 있지만이 작업을 수행하는 데 더 좋은 방법이 있습니까?

+0

당신이 C 번호 (텍스트) 파일 또는 C# (.NET) 클래스를 수정하는 뜻 :

시작 지점으로 사용할 수있는 Exec에서의 매우 간단한 버전은 무엇입니까? 텍스트를 수정하는 것은 컴파일 된 코드를 수정하는 것과 완전히 다릅니다. – larsmoa

+0

나는 C# 텍스트 파일을 의미합니다. 그것은 테스트 파일을 생성하기위한 것입니다. StreamWriter를 사용하여이 작업을 수행 할 수 있지만이 작업을 수행하는 데 더 좋은 방법이있을 수 있습니다. – Mathieu

+0

코드를 구문 트리로 구문 분석 한 다음 해당 구문 트리를 적용하여 함수를 추가하고 해당 구문 트리에서 새 파일을 생성 할 수있는 무언가를 찾아야합니다. –

답변

5

EnvDTE는 갈 수있는 방법입니다. VisualStudio Add-In을 개발 한 다음 Exec 메서드를 수정할 수 있습니다. 이 방법에서는 활성 문서와 해당 ProjectItem을 가져와야합니다. 여기서 많은 CodeElements가 포함 된 CodeModel을 찾을 수 있습니다. 이 요소들 중에서 CodeNamespace를 찾고이 요소 안에 CodeClass를 찾아야합니다. 이 속성은 AddFunction에 응답하는 객체이며 속성과 코드를 추가 할 수있는 새 CodeFunction을 반환합니다 (EditPoint를 사용해야하므로 너무 좋아하지 않는 부분입니다).

public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled) 
    { 
     handled = false; 
     if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault) 
     { 
      handled = true; 
      if (commandName == "TestAddMethod.Connect.TestAddMethod") 
      { 
       Document activeDoc = _applicationObject.ActiveDocument; 
       if (activeDoc == null) 
        return; 
       ProjectItem prjItem = activeDoc.ProjectItem; 
       if (prjItem == null) 
        return; 
       FileCodeModel fcm = prjItem.FileCodeModel; 
       if (fcm == null) 
        return; 

       CodeElements ces = fcm.CodeElements; 
       // look for the namespace in the active document 
       CodeNamespace cns = null; 
       foreach (CodeElement ce in ces) 
       { 
        if (ce.Kind == vsCMElement.vsCMElementNamespace) 
        { 
         cns = ce as CodeNamespace; 
         break; 
        } 
       } 
       if (cns == null) 
        return; 
       ces = cns.Members; 
       if (ces == null) 
        return; 
       // look for the first class 
       CodeClass cls = null; 
       foreach (CodeElement ce in ces) 
       { 
        if (ce.Kind == vsCMElement.vsCMElementClass) 
        { 
         cls = ce as CodeClass; 
         break; 
        } 
       } 
       if (cls == null) 
        return; 
       CodeFunction cf = cls.AddFunction("TestMethod1", vsCMFunction.vsCMFunctionFunction, vsCMTypeRef.vsCMTypeRefVoid, -1, vsCMAccess.vsCMAccessPrivate); 
       cf.AddAttribute("TestMethod", "true"); 
       TextPoint tp = cf.GetStartPoint(vsCMPart.vsCMPartBody); 
       EditPoint ep = tp.CreateEditPoint(); 
       ep.Indent(); 
       ep.Indent(); 
       ep.Indent(); 
       ep.Insert("string test = Helper.CodeExample();"); 
      } 
     } 
    } 
+0

이것은 내가 찾고있는 것입니다! 이것은 cs 파일을 텍스트 파일처럼 편집하는 것보다 낫습니다. 고마워요! – Mathieu

+1

이것은 나를위한 환상적인 출발점이었습니다! 고맙습니다! 또한 들여 쓰기보다는'SmartFormat'을 할 수 있다는 점에 주목할 필요가 있습니다. Smart는'EditPoint' 호출에서 시작하여 'TextPoint' 매개 변수에서 끝나는 다양한 코드를 포맷합니다. 위의 코드를 사용하는 예제는 다음과 같습니다. 'ep.Insert ("string test = Helper.CodeExample();"); 'tp.CreateEditPoint(). SmartFormat (ep); – philt5252