2

VS 2010 (C#) T4 テンプレートを使用してコードを生成しています。

プロジェクト内のすべてのタイプを繰り返し処理し、エンティティ poco クラスを絞り込み、ラッパーを生成する必要があります。問題は、プロジェクトの名前空間が認識されていないことです。

ソリューションの構造は次のとおりです。

namespace MySolution.Entities
{
    public class Employee { ... }
    public class Department { ... }
}

// Seperate project referenceing MySolution.Entities.
namespace MySolution.Database
{
    public partial class Context { ... }

    // Should generate Context.cs as a partial class with after iterating Syste.Types available in MySolution.Entities.
    Context.tt
}

テキストテンプレートは次のとおりです。

<#@ template language="C#" #>
<#@ Output Extension=".cs" #>

namespace MySolution.Database
{
    public partial class Context:
        System.Data.Entity.DbContext
    {
<#
System.Type [] types = typeof(MySolution.Entities).Assembly.GetTypes();
for (int i=0; i < types.Count; i++)
#>
        public <#= types[i].Name; #> <#= types[i].Name; #> { get; set; }
    }
}

上記のコードはエラーを生成します: タイプまたは名前空間 'MySolution' が見つかりません。using ディレクティブまたはアセンブリ参照がありませんか? 次に、次のコード行を追加して、アセンブリを含めます。

<#@ Assembly Name="..\MySolution.Entities\bin\x86\Release\MySolution.Entities.dll" #>

今度は別のエラーが表示されます: アセンブリ参照 '..\..\..TrafficMonitor.Core\bin\x86\Release\TrafficMonitor.Library.dll' を解決しようとしているときに、ホストが例外をスローしました。変換は実行されません。次の例外がスローされました: System.IO.FileLoadException: 指定されたアセンブリ名またはコードベースが無効でした。(HRESULT からの例外: 0x80131047)

この制限を克服する方法についてのアイデアはありますか?

4

2 に答える 2

4

このエラーは、T4 テンプレート プロセッサがアセンブリを見つけられないために発生します。

T4 テンプレートの Assembly ディレクティブでアセンブリへのフル パスを使用すると、アセンブリが検出されます。完全なパスを使用するためのより良い方法は、T4 テンプレートの実行時に展開される $(SolutionDir) などの Visual Studio マクロ変数の 1 つを使用することです。

<#@ Assembly Name="$(SolutionDir)MySolution.Entities\bin\x86\Release\MySolution.Entities.dll" #>
于 2013-01-31T17:38:23.087 に答える
3

まだコンパイルしていないアセンブリを静的に参照することはできません(アセンブリがコンパイルされる前にT4が実行されることを忘れないでください) T4を使用してデコレータクラスを生成する方法を考慮に入れることができる素晴らしい記事があります

<#@ Assembly Nameまた、T4は既にコンパイル済みのアセンブリで動作しますが、T4はコンパイル前に動作するため、を介してアセンブリを参照しないでください。したがって、ワークフローは次のようになります。アプリケーションをコンパイルし、t4を実行し、t4からの新しいソースを使用してアプリケーションを再コンパイルします。そしてこれは、T4が動作しているソースコードを変更した後の毎回です。

于 2013-01-31T17:26:15.410 に答える