先の記事でも書きましたが、T4ってコード補完が効かないのはかなりキツいですよね?
というわけでT4でコード補完(インテリセンス)を有効にする方法を考えてみました。
※真面目にタイトルの件でお悩みの方はVisualSudioにこれかこれを導入するのが近道です。
(無料のVisual Studio 2013 Communityにも導入できます)
概要
前回の記事でC#とT4を同一ファイルでまとめることが出来るのを証明(?)しましたが、これを利用すればVisual Studio(以下VS)にC#コードと思わせて補完させつつT4のコードを記述することが出来るのは自明の理ですよね?
というわけでやってみました。
まずはアセンブリ参照
しかし、T4で使う関数や変数の実体はMicrosoft.VisualStudio.TextTemplatingネームスペースにあるTextTransformationやITextTemplatingEngineHostクラスにありますので、これをIDEが把握していなければ補完もへったくれもありません。
ですので、上記のクラスを含んでいるDLLを参照設定に加えないといけないのですが、どこにあるんでしょう?
VS2013をインストールしていれば、このDLLは(Windows8.1の場合)
・C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplating.12.0\v4.0_12.0.0.0_b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplating.12.0.dll
・C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplating.Interfaces.10.0\v4.0_10.0.0.0b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll
・C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplating.Interfaces.11.0\v4.0_11.0.0.0_b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplating.Interfaces.11.0.dll
にありますので、それぞれ追加しておきましょう。
参照設定すると、ビルドしてできた.EXEが上記DLLに依存するのではないかという心配があるかと思いますが、試した限りでは実際に参照しない限り問題ないようです。
コードの準備
参照設定の追加が終わったら、インテリセンスが効くようにコードを準備します。
プロジェクトにC#ファイルを追加し、プロパティのカスタムツールに「TextTemplatingFileGenerator」と入れ、下記のコードをコピペしましょう。
/*<# GenerationEnvironment.Length -= 2; #>
<#//++++++++++++++++++++++++T4のみ認識する領域++++++++++++++++++++++++++++++++++#>
<#//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#>
<#//*///#><#+/*
//***************************C#のみ認識する領域***********************************
#if DEBUG
namespace SharpTemplate
{
class SharpTemplate : Microsoft.VisualStudio.TextTemplating.TextTransformation
{
#pragma warning disable 0169, 0649
Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost Host;
#pragma warning restore 0169, 0649
public override string TransformText()
{
return "";
}
//*///#><#+
//----------------C#・T4共に認識するクラス機能ブロック------------------------
public void test() {
}
//----------------------------------------------------------------------------
//*///#><#+/*
}
}
#endif
//*///#>
コピペしたら、testメソッドのところでthis.やHost.と打ち込んでみると幸せになれます。もちろんこのままT4テンプレートとして使うこともできます。
なおC#では基本利用しないクラスですから#ifディレクティブでDEBGUビルドに設定されているときのみ有効になるようになっています。