Aracılığıyla paylaş


Visual Studio uzantısında metin dönüştürmeyi çağırma

Menü komutu veya etki alanına özgü dil gibi bir Visual Studio uzantısı yazıyorsanız, metin şablonlarını dönüştürmek için metin şablon oluşturma hizmetini kullanabilirsiniz. STextTemplating hizmetini alın ve ITextTemplating'e yayınlayın.

Metin şablon oluşturma hizmetini alma

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));

Parametreleri şablona geçirme

Parametreleri şablona geçirebilirsiniz. Şablonun içinde, yönergesini kullanarak <#@parameter#> parametre değerlerini alabilirsiniz.

Parametre türü için, seri hale getirilebilen veya sıralanabilen bir tür kullanmalısınız. Diğer bir ifadeyle, türü ile SerializableAttributebildirilmelidir veya türünden MarshalByRefObjecttüretilmelidir. Bu kısıtlama gereklidir çünkü metin şablonu ayrı bir AppDomain içinde yürütülür. System.String ve System.Int32 gibi tüm yerleşik türler serileştirilebilir.

Parametre değerlerini geçirmek için, çağıran kod değerleri sözlüğüne Session veya CallContextöğesine yerleştirebilir.

Aşağıdaki örnek bir kısa test şablonunu dönüştürmek için her iki yöntemi kullanmaktadır:

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

Hata raporlama ve çıkış yönergesi

İşleme sırasında ortaya çıkan hatalar Visual Studio hata penceresinde görüntülenir. Ayrıca, ITextTemplatingCallback uygulayan bir geri çağırma belirterek hatalarla ilgili bildirim alabilirsiniz.

Sonuç dizesini bir dosyaya yazmak istiyorsanız, şablondaki yönergede hangi dosya uzantısının ve kodlamanın belirtildiğini <#@output#> bilmek isteyebilirsiniz. Bu bilgiler, geri çağırmanıza da geçirilir. Daha fazla bilgi için bkz . T4 Çıkış Yönergesi.

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; }
}

Kod, şuna benzer bir şablon dosyasıyla test edilebilir:

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

Derleyici uyarısı Visual Studio hata penceresinde görünür ve ayrıca öğesine ErrorCallbackbir çağrı oluşturur.

Başvuru parametreleri

'den türetilen bir parametre sınıfını kullanarak metin şablonundaki MarshalByRefObjectdeğerleri geçirebilirsiniz.

Önceden işlenmiş bir metin şablonundan metin oluşturmak için: Oluşturulan sınıfın yöntemini çağırın TransformText() . Daha fazla bilgi için bkz . T4 Metin Şablonları ile Çalışma Zamanı Metin Oluşturma.

Visual Studio uzantısı dışında metin oluşturmak için: Özel bir konak tanımlayın. Daha fazla bilgi için bkz . Özel Ana Bilgisayar Kullanarak Metin Şablonlarını İşleme.

Daha sonra derlenip yürütülebilecek kaynak kodu oluşturmak için: ITextTemplating'in PreprocessTemplate yöntemini çağırın.