建議使用 Visual Studio 2017

叫用 VS 擴充功能中的文字轉換

 

如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件

如果您在撰寫如功能表命令或網域指定的語言這類 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#> 指示詞取得參數值。

針對參數的類型,您必須使用可序列化或可封送處理的類型。 也就是說,類型必須使用 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 擴充功能外部產生文字:
定義自訂主應用程式。 如需詳細資訊,請參閱使用自訂主機處理文字範本

若要產生可在之後編譯及執行的原始程式碼:
呼叫 ITextTemplatingt4.PreprocessTemplate() 方法。

顯示: