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();");
}
}
}
당신이 C 번호 (텍스트) 파일 또는 C# (.NET) 클래스를 수정하는 뜻 :
시작 지점으로 사용할 수있는 Exec에서의 매우 간단한 버전은 무엇입니까? 텍스트를 수정하는 것은 컴파일 된 코드를 수정하는 것과 완전히 다릅니다. – larsmoa
나는 C# 텍스트 파일을 의미합니다. 그것은 테스트 파일을 생성하기위한 것입니다. StreamWriter를 사용하여이 작업을 수행 할 수 있지만이 작업을 수행하는 데 더 좋은 방법이있을 수 있습니다. – Mathieu
코드를 구문 트리로 구문 분석 한 다음 해당 구문 트리를 적용하여 함수를 추가하고 해당 구문 트리에서 새 파일을 생성 할 수있는 무언가를 찾아야합니다. –