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#>
ディレクティブを使用してパラメーター値を取得できます。
パラメーターの型については、シリアル化またはマーシャリング可能な型を使用する必要があります。 つまり、SerializableAttribute を使用して型を宣言するか、MarshalByRefObject から型を派生する必要があります。 この制限が必要なのは、テキスト テンプレートは別の AppDomain で実行されるためです。 System.String や System.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 拡張機能の外部でテキストを生成するには: カスタム ホストを定義します。 詳細については、「カスタム ホストを使用したテキスト テンプレートの処理」を参照してください。
後でコンパイルして実行できるソース コードを生成するには、ITextTemplatingの PreprocessTemplate メソッドを呼び出します。