LoginSignup
4
4

More than 5 years have passed since last update.

[ネタ] T4でコード補完したい!

Last updated at Posted at 2015-05-14

先の記事でも書きましたが、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.0
b03f5f7f11d50a3a\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ビルドに設定されているときのみ有効になるようになっています。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4