다음을 통해 공유


Visual Studio 확장에서 텍스트 변환 호출

메뉴 명령 또는 도메인 특정 언어와 같은 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와 같은 모든 기본 제공 형식을 직렬화할 수 있습니다.

매개 변수 값을 전달하기 위해 호출 코드에서 값을 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

오류 보고 및 출력 지시문

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

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

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에서 파생되는 매개 변수 클래스를 사용하여 텍스트 템플릿의 값을 전달할 수 있습니다.

전처리된 텍스트 템플릿에서 텍스트 생성: 생성된 클래스의 TransformText() 메서드를 호출합니다. 자세한 내용은 T4 텍스트 템플릿을 사용하여 런타임 텍스트 생성을 참조하세요.

Visual Studio 확장 외부에서 텍스트 생성: 사용자 지정 호스트를 정의합니다. 자세한 내용은 사용자 지정 호스트를 사용하여 텍스트 템플릿 처리를 참조하세요.

나중에 컴파일 및 실행할 수 있는 소스 코드를 생성하려면 ITextTemplatingPreprocessTemplate 메서드를 호출합니다.