성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>하나의 T4 템플릿으로 여러 개의 소스코드 파일을 자동으로 생성하는 방법</h1> <p> T4를 이용한 자동 생성 코드는 예전에 한번 소개해 드렸습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > T4 를 이용한 INotifyPropertyChanged 코드 자동 생성 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1619'>http://www.sysnet.pe.kr/2/0/1619</a> </pre> <br /> 그런데, 때로는 출력 파일을 다중으로 할 필요가 있습니다. 다행히, 이에 대한 방법은 아래의 글에 전부 공개되어 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > How to generate multiple outputs from single T4 template ; <a target='tab' href='http://www.olegsych.com/2008/03/how-to-generate-multiple-outputs-from-single-t4-template/'>http://www.olegsych.com/2008/03/how-to-generate-multiple-outputs-from-single-t4-template/</a> </pre> <br /> 좀 복잡하니, ^^ 간단하게 정리해 볼까요?<br /> <br /> 우선 "<a target='tab' href='http://www.olegsych.com/2008/03/how-to-generate-multiple-outputs-from-single-t4-template/'>How to generate multiple outputs from single T4 template</a>" 글에 공개된 예제 프로젝트를 다운로드 받습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Source code ; <a target='tab' href='http://www.olegsych.com/wp-content/uploads/2008/03/multioutputpot.zip'>http://www.olegsych.com/wp-content/uploads/2008/03/multioutputpot.zip</a> </pre> <br /> 이 압축 파일의 내용 중에 MultiOutput.tt 파일만 필요하니 그것만 복사해서 여러분들의 솔루션에 추가해 줍니다. MultiOutput.tt 파일의 경우 스스로에 대한 소스 코드 생성이 목적은 아니므로 "Custom Tool"의 내용을 지워줍니다.<br /> <br /> <img alt='t4_multiple_output_1.png' src='/SysWebRes/bbs/t4_multiple_output_1.png' /> <br /><br /> 자, 이제 소스 코드를 생성할 용도의 tt 파일을 원하는 만큼 추가해줍니다. 여기서는 csgen.tt, jsgen.tt 2개의 파일을 추가합니다. 2개 모두 마찬가지로 "Custom Tool"의 내용을 지워줍니다.<br /> <br /> 예를 들어, 아래는 jsgen.tt 파일의 내용이고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <#@ template language="C#" #> <#@ output extension=".js" #> <#@ import namespace="System.Runtime.Remoting.Messaging" #> var <#= Parameter #> = { } <#+ string Parameter { get { string result = (string)CallContext.GetData("Parameter"); if (result == null) result = string.Empty; return result; } } #> </pre> <br /> 다음은 csgen.tt 파일입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <#@ template language="C#" #> <#@ output extension=".cs" #> <#@ import namespace="System.Runtime.Remoting.Messaging" #> public class <#= Parameter #> { } <#+ string Parameter { get { string result = (string)CallContext.GetData("Parameter"); if (result == null) result = string.Empty; return result; } } #> </pre> <br /> 마지막으로 2개의 tt 파일과 MultiOutput.tt에서 제공되는 메서드를 이용해 다중 파일을 생성하는 tt 파일을 만들어 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <#@ import namespace="System.Runtime.Remoting.Messaging" #> <#@ include file="MultiOutput.tt" #> <# CallContext.SetData("Parameter", "MyType"); // csgen.tt, jsgen.tt 내부에서 활용할 데이터를 전달 ProcessTemplate("csgen.tt", "DataObject.cs"); ProcessTemplate("jsgen.tt", "DataObject.js"); DeleteOldOutputs(); #> </pre> <br /> 이번 tt 파일은 소스 코드를 생성할 것이므로 Custom Tool의 내용을 지워서는 안됩니다. 이렇게 만들고 tt 파일을 저장하면 하위에 다음과 같이 3개의 파일이 생성됩니다<br /> <br /> <img alt='t4_multiple_output_2.png' src='/SysWebRes/bbs/t4_multiple_output_2.png' /> <br /><br /> 이 중에서 DataObject.cs, DataObject.js 파일은 각각 csgen.tt, jsgen.tt에 의해 생성된 것이고 DataObjectGen.js 파일은 본래의 DataObjectGen.tt에 의해 성성된 것입니다. (현재는 DataObjectGen.tt에 별다른 출력 내용이 없으므로 아무것도 포함하고 있지 않습니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 그리하여, "<a target='tab' href='http://www.sysnet.pe.kr/2/0/1619'>T4 를 이용한 INotifyPropertyChanged 코드 자동 생성</a>" 글과 이번 글의 내용을 합치면 어떻게 될까요?<br /> <br /> 단일 XML 하나에 정의된 Data Object 스키마를 통해 다중 언어로의 구현 타입으로 자동으로 출력하는 것이 가능합니다. ^^<br /> <br /> (<a target='tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=842&boardid=331301885'>첨부된 파일은 위의 실습을 포함한 프로젝트</a>입니다.)<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1667
(왼쪽의 숫자를 입력해야 합니다.)