다음을 통해 공유


VS 확장에서 텍스트 변환 호출

메뉴 명령 또는 도메인별 언어와 같은 Visual Studio 확장을 작성하는 경우 텍스트 템플릿 서비스를 사용하여 텍스트 템플릿을 변환할 수 있습니다. STextTemplating 서비스를 가져와서 ITextTemplating으로 캐스팅합니다.

텍스트 템플릿 서비스 가져오기

using Microsoft.VisualStudio.TextTemplating;
using Microsoft.VisualStudio.TextTemplating.VSHost;
...
// Get a service provider – how you do this depends on the context:
IServiceProvider serviceProvider = ...; // An instance of EnvDTE, for example 

// Get the text template service:
ITextTemplating t4 = serviceProvider.GetService(typeof(STextTemplating)) as ITextTemplating;

// Process a text template:
string result = t4.ProcessTemplate(filePath, System.IO.File.ReadAllText(filePath));

템플릿에 매개 변수 전달

템플릿에 매개 변수를 전달할 수 있습니다. 템플릿 내에서 <#@parameter#> 지시문을 사용하여 매개 변수 값을 가져올 수 있습니다.

매개 변수 형식으로는 serialize 가능하거나 마샬링할 수 있는 형식을 사용해야 합니다. 즉, 매개 변수 형식은 SerializableAttribute를 사용하여 선언되거나 MarshalByRefObject에서 파생되어야 합니다. 텍스트 템플릿은 별도의 AppDomain에서 실행되므로 이러한 제한 사항이 필요합니다. System.StringSystem.Int32와 같은 모든 기본 제공 형식은 serialize 가능합니다.

매개 변수 값을 전달하기 위해 호출 코드에서 값을 Session 사전이나 CallContext에 둘 수 있습니다.

다음 예제에서는 두 가지 방법을 사용하여 짧은 테스트 템플릿을 변환합니다.

using Microsoft.VisualStudio.TextTemplating;
using Microsoft.VisualStudio.TextTemplating.VSHost;
...
// Get a service provider – how you do this depends on the context:
IServiceProvider serviceProvider = dte; 

// Get the text template service:
ITextTemplating t4 = serviceProvider.GetService(typeof(STextTemplating)) as ITextTemplating;
ITextTemplatingSessionHost sessionHost = t4 as ITextTemplatingSessionHost;

// Create a Session in which to pass parameters:
sessionHost.Session = sessionHost.CreateSession();
sessionHost.Session["parameter1"] = "Hello";
sessionHost.Session["parameter2"] = DateTime.Now;

// Pass another value in CallContext:
System.Runtime.Remoting.Messaging.CallContext.LogicalSetData("parameter3", 42);

// Process a text template:
string result = t4.ProcessTemplate("",
   // This is the test template:
   "<#@parameter type=\"System.String\" name=\"parameter1\"#>"
 + "<#@parameter type=\"System.DateTime\" name=\"parameter2\"#>"
 + "<#@parameter type=\"System.Int32\" name=\"parameter3\"#>"
 + "Test: <#=parameter1#>    <#=parameter2#>    <#=parameter3#>");

// This test code yields a result similar to the following line:
//     Test: Hello    07/06/2010 12:37:45    42 

오류 보고 및 output 지시문

처리 중에 발생하는 오류는 모두 Visual Studio 오류 창에 표시됩니다. 또한 ITextTemplatingCallback을 구현하는 콜백을 지정하여 오류 알림을 받을 수 있습니다.

결과 문자열을 파일에 기록하려는 경우 템플릿의 <#@output#> 지시문에 지정된 파일 확장명과 인코딩을 알아야 할 수 있습니다. 이 정보도 역시 콜백에 전달됩니다. 자세한 내용은 T4 Output 지시문을 참조하십시오.

void ProcessMyTemplate(string MyTemplateFile)
{
  string templateContent = File.ReadAllText(MyTemplateFile);
  T4Callback cb = new T4Callback();
  // Process a text template:
  string result = t4.ProcessTemplate(MyTemplateFile, templateContent, cb);
  // If there was an output directive in the MyTemplateFile,
  // then cb.SetFileExtension() will have been called.
  // Determine the output file name:
  string resultFileName = 
    Path.Combine(Path.GetDirectoryName(MyTemplateFile), 
        Path.GetFileNameWithoutExtension(MyTemplateFile)) 
      + cb.fileExtension;
  // Write the processed output to file:
  File.WriteAllText(resultFileName, result, cb.outputEncoding);
  // Append any error messages:
  if (cb.errorMessages.Count > 0)
  {
    File.AppendAllLines(resultFileName, cb.errorMessages);
  }
}

class T4Callback : ITextTemplatingCallback
{
  public List<string> errorMessages = new List<string>();
  public string fileExtension = ".txt";
  public Encoding outputEncoding = Encoding.UTF8;

  public void ErrorCallback(bool warning, string message, int line, int column)
  { errorMessages.Add(message); }

  public void SetFileExtension(string extension)
  { fileExtension = extension; }

  public void SetOutputEncoding(Encoding encoding, bool fromOutputDirective)
  { outputEncoding = encoding; }
}

다음과 비슷한 템플릿 파일을 사용하여 코드를 테스트할 수 있습니다.

<#@output extension=".htm" encoding="ASCII"#>
<# int unused;  // Compiler warning "unused variable"
#>
Sample text.

컴파일러 경고가 Visual Studio 오류 창에 나타나고 ErrorCallback에 대한 호출도 생성됩니다.

참조 매개 변수

MarshalByRefObject에서 파생되는 매개 변수 클래스를 사용하여 텍스트 템플릿의 값을 전달할 수 있습니다.

관련 항목