2

CodeDom を使用してコード生成を行っています。うまく機能しますが、生成されたソース コード ファイルをプロジェクトに含める方法が見つかりませんでした。プロジェクト ファイルとの統合をサポートしているため、T4 とT4Toolboxを使用してコードを生成するようになりました。

CodeDom もこの機能をサポートしているかどうかは誰にもわかりませんか? この 1 つの機能しかサポートしていない場合は、CodeDom をもう一度検討することを検討します。

CodeDom でソース コード ファイルを作成する方法の例を次に示します。

protected void CreateSourceFile(CodeCompileUnit codeCompileUnit,
                                string fileName,
                                out string fileNameWithExtension)
{
    fileNameWithExtension = string.Format("{0}.{1}",
                                          fileName,
                                          CodeProvider.FileExtension);

    var indentedTextWriter =
        new IndentedTextWriter(new StreamWriter(fileNameWithExtension,
                                                false),
                               TabString);

    CodeProvider.GenerateCodeFromCompileUnit(codeCompileUnit,
                                             indentedTextWriter,
                                             new CodeGeneratorOptions());

    indentedTextWriter.Close();
}

これは問題なく動作しますが、ファイルをどこかのハード ドライブ (おそらく bin フォルダー) に出力するだけです。

T4 で使用するコードの 2 番目の例を次に示します。これは、テンプレートが変換されるプロジェクトの一部として出力を指定します。

public class RDFSClassGenerator : Generator
{
    private readonly string rootNamespace;
    private readonly string ontologyLocation;

    public RDFSClassGenerator(
        string rootNamespace,
        string ontologyLocation)
    {
        this.rootNamespace = rootNamespace;
        this.ontologyLocation = ontologyLocation;
    }

    protected override void RunCore()
    {

        XElement ontology = XElement.Load(ontologyLocation);
        var service = new RDFSGeneratorService(ontology);

        foreach (MetaClass metaClass in service.MetaClasses)
        {
            var rdfsClassTemplate = new RDFSClassTemplate(rootNamespace, metaClass);
            rdfsClassTemplate.Output.File = "Domain/" + metaClass.Name + ".cs";
            rdfsClassTemplate.Render();
        }

    }
}

したがって、T4 コードはファイルをプロジェクトの "Domain" フォルダーに出力します。しかし、CodeGen のものはディスク上のファイルを出力するだけで、プロジェクト ファイルを更新しません。

ここにビジュアルがあります:

代替テキスト

4

2 に答える 2

3

はい、できます。方法は次のとおりです。 http://www.olegsych.com/2009/09/t4-and-codedom-better-together/

于 2010-07-28T13:53:33.300 に答える
1

短い答えはノーですが、私は間違っている可能性があります(否定的なことを証明しようとしたことがありますか?)

CodeDomはT4と完全に同等ではないため、あなたの質問は少し混乱しました。T4テンプレートは、同じ方法でコードファイルを生成する便利な方法です。たとえば、asp.netはHTMLファイルを生成し、実行されるテキストとコードを混合して、他の何か(コンパイラやブラウザなど)によって解釈されるファイルを生成します。 )。CodeDomは通常、ファイルではなく実行時にアセンブリを生成するために使用されますが、(発見したように)実行することもできます。

T4を使用すると、ソリューションにファイルを簡単に追加できますが、CodeDomを使用してこれを行うこともできます。ソリューションとの直接のやり取りをサポートしているとは思いませんが、EnvDTEまたはVisualStudioの自動化モデルを使用してこれを管理できます。

これに伴う問題は、自動化モデルの操作が簡単ではないことです。EnvDTEはCOMクラスのラッパーであり、コーディングするのは常に楽しいものです。また、オブジェクトを取得しようとするときは注意する必要があります。ナイーブな実装は、ロードされたVisualStudioの最初のインスタンスからオブジェクトを取得します。現在のインスタンスを見つけるには、実行中のオブジェクトテーブルをポーリングする必要があります。それを入手したら、探している場所をdteで検索したり、ソース管理やロックされたファイルなどを処理したりする必要があります。

それを使って、T4が最初に作成された理由を学び始めます。

あなたが自分自身に問いかけなければならない質問は、「CodeDomは、T4がそのすべての欠点を補うことができないほど私に与えてくれますか?」です。

于 2010-07-28T12:08:10.773 に答える