T4와 함께 .NET 반사를 어떻게 사용합니까?
-
13-09-2019 - |
문제
텍스트 템플릿이 포함 된 AC# 프로젝트가 있습니다. 이 템플릿이 프로젝트의 C# 클래스에 대한 반영을 기반으로 일부 SQL을 생성하려고합니다.
T4를 사용하여 현재 프로젝트의 내용에 어떻게 액세스합니까? 가능하고, 그렇다면 반사가 가능합니까, 아니면 구문 분석 해야하는 원시 소스에 액세스 할 수 있습니까?
미리 감사드립니다!
해결책
T4를 사용하여 현재 프로젝트의 내용에 어떻게 액세스합니까?
한 가지 방법은 Envdte Com 구성 요소를 사용하는 것입니다. Googling T4와 Envdte는 많은 예를 가져와야합니다.
가능하고, 그렇다면 반사가 가능합니까, 아니면 구문 분석 해야하는 원시 소스에 액세스 할 수 있습니까?
반사는 T4에서 확실히 사용할 수 있습니다. 그것은 당신이 기대하는대로 주로 작동합니다.
올레그 시크 일반적인 T4 사용 시나리오와 관련하여 많은 훌륭한 블로그 항목이 있지만 T4에 대한 다른 리소스도 많이 있습니다.
다른 팁
잠금 문제 외에도 T4 템플릿 내에서 반사를 사용하여주의하십시오. VS2010의 템플릿 생성기는 프레임 워크의 버전 4.0에 대해 실행되므로 3.5 이하의 코드를 생성하는 경우 원치 않는 종속성을 소개 할 수 있습니다.
방금 반사를 사용하여 매개 변수가없는 호출을 생성할지 여부를 결정한 후 어려운 방법을 찾았습니다. ToString
다양한 BCL 유형의 경우. TimeSpan
전적으로 ToString()
2.0이지만 4.0은 추가됩니다 ToString(string)
:피
이것은 잠금 문제를 해결하지는 않지만 (VS2010 이하라고 들었음에도 불구하고) DLL을 온도 위치로 복사하고 해당 복사 된 어셈블리를 사용할 수 있습니다.
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".txt" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.IO" #>
<#
var newFileName = System.IO.Path.GetTempFileName();
System.IO.File.Copy(@"C:\Development\CustomAssembly.dll",newFileName,true);
var assembly = Assembly.LoadFrom(newFileName);
var type = assembly.GetType("CustomAssembly.DummyClass");
#>
<#=newFileName#>
<#=type#>