1

T4 テンプレート TextTemplatingFilePreprocessor (出力を生成するクラスを生成する) があるとします: ジェネレータ クラスに属性を追加することは可能ですか (出力自体の内部ではありません)? 基本的に私はこのようなものが欲しい:

#line 1 "C:\Path\To\MyTemplate.tt"
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "11.0.0.0")]
[MyAttributeHere]
public partial class MyTemplate : MyTemplateBase
{
    // ...

そのテンプレートの別の部分宣言を使用して別のファイルを作成し、それに属性を追加できることはわかっていますが、可能であればそれを避けたいと思います。

4

2 に答える 2

1

を置き換えるには、独自のカスタムツールを提供する必要があると思いますTextTemplatingFilePreprocessor

カスタム ツール プロパティ

サブクラス化Microsoft.VisualStudio.TextTemplating.VSHost.TemplatedPreprocessorしてオーバーライドすると思いますProcessTemplate()

于 2013-05-24T14:19:14.007 に答える
1

VS 2012 を使用している場合、これは単純なカスタム ディレクティブ プロセッサを使用して可能です。Visual Studio SDKを使用して、 Visual Studio 用の単純な MEF コンポーネント拡張を作成します (エディターのカラーライザー テンプレートのようなものを使用します)。IDirectiveProcessorテンプレートが提供するコードを削除し、インターフェースのほとんど操作なしの実装を提供する簡単なクラスに置き換えます。Microsoft.VisualStudio.TextTemplating.Interfaces.11.0.dll

GetTemplateClassCustomAttributesそのインターフェイスのメソッドの実装で属性を発行します。

最後に、 T4 が新しいディレクティブ プロセッサを取得できるように、クラスを同じアセンブリの[DirectiveProcessor]および属性で装飾します。[SuppportedDirective]

ビルドするときは、生成時にこの新しいディレクティブをサポートする必要がある任意のコンピューターに簡単に展開できる VSIX を取得する必要があります。テンプレートの先頭に新しいディレクティブを配置すると、属性が前処理されたクラスに追加されます。何かのようなもの:

<#@ MyCustomAttr processor="MyCode.CustomAttrProvider" #>

于 2013-05-28T20:17:02.520 に答える