샘플 코드

<#@ template debug="false" hostspecific="true" language="C#" #> <#@ assembly name="System.Core" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="System.Reflection" #> <#@ output extension=".cs" #> <# uint count = 0; var properties = new List<string>(); var folderPath = Host.ResolvePath("./"); var files = Directory.GetFiles(folderPath, "*.cs", SearchOption.AllDirectories); foreach(string filename in files) {

if(filename.Contains("Test.cs"))

continue;

var reader = File.OpenText(filename); bool isNamespace = false; while(true) { string line = reader.ReadLine(); if(line == null) { break; }

if(line.Contains("namespace Test")){

isNamespace = true;

}

if(isNamespace && line.Contains("class ") == true) {

var strs = line.Split(' ', ':'); for (int i = 0; i < strs.Length; i++) {

if (strs[i] != "class")

continue;

properties.Add(strs[i + 1]); break;

}

}

} } #> namespace Message { public static class Test { <# foreach (string propertyName in properties) { #> public const uint <#= propertyName #> = <#= count++ #>; <# } #> } }

샘플 코드 설명
Test.tt 파일이 위치한 폴더에서 모든 .cs파일을 불러와 namespace가 Test라면 파일에 작성된 클레스를 불러와

Test.cs에 클래스 이름 별로 인덱스를 부여함.


tt파일을 생성하면 속성에 기본 설정으로 TextTemplatingFileGenerator으로 되어있어서 저장할 때 템플릿 코드를 생성함.

빌드 이벤트를 통해 빌드했을때 템플릿을 생성하게 이벤트를 걸어줘야함.


빌드 이벤트 설정

빌드 이벤트를 통해서 빌드 tt파일이 파일을 생성하게 연결해 줘야함.

사용하는 목적에 따라서 빌드전 or 후로 설정 하면 됨.

set TTDir="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\TextTransform.exe" set TTGenSrc="$(ProjectDir)Message\Test.cs %TTDir% "$(ProjectDir)Message\MSGID.tt" -out %TTGenSrc%

TextTransform.exe 경로는 사용하는 vs 버전에 따라서 다를수 있음.

Community를 사용한다면 Enterprise를 Community로 변경해야함.


참고자료

https://docs.microsoft.com/ko-kr/visualstudio/modeling/design-time-code-generation-by-using-t4-text-templates?view=vs-2017#reading-files-or-other-sources

https://docs.microsoft.com/ko-kr/visualstudio/ide/how-to-specify-build-events-csharp?view=vs-2017

https://msdn.microsoft.com/ko-kr/library/42x5kfw4.aspx

반응형

'Programming > Blah Blah' 카테고리의 다른 글

데드 레커닝(Dead Reckoning)  (0) 2019.05.31
SharpNav  (0) 2018.09.01
123  (0) 2018.06.21
비주얼 스튜디오 확장(vsix)  (0) 2018.05.05
배치파일  (0) 2018.04.10
신경망 첫걸음  (0) 2018.03.25
C# 가비지 컬렉터(Garbage Collector) 원리  (0) 2018.02.03
CCU와 MCU란?  (0) 2018.01.25