web-dev-qa-db-ja.com

ソリューション内の既存プロジェクトのアセンブリを追加するT4テンプレート

こんにちは、T4テンプレートファイルのソリューションに既存のプロジェクトのアセンブリを追加する必要があります。問題は、T4テンプレートがProject.WebApiというプロジェクトにあり、T4テンプレートに必要なクラスがProject.Common.WebApiというプロジェクト内にあることです。

私はこのような名前空間をインポートしようとしました:

<#@ import namespace="Project.Common.WebApi.T4TemplateAttribute" #>

しかし、私はこのエラーを受け取ります:

型または名前空間名 'Project'が見つかりませんでした(usingディレクティブまたはAssembly参照がありませんか?)

私はこのようなアセンブリを追加しようとしました:

<#@ Assembly name="Project.Common.WebApi" #>

そして、私はこのエラーを受け取りました:

変換のコンパイル:メタデータファイル「Project.Common.WebApi」が見つかりませんでした

T4Template(Project.WebApi)を含む私のプロジェクトにはProject.Common.WebApiへの参照がありますが、私が読んだものからT4Templateはプロジェクト内の参照を使用しません。

この問題を解決するにはどうすればよいですか?

45
aleczandru

T4は、他のコードからほぼ完全に独立して動作します。ただし、Assemblyディレクティブを使用して正しい軌道に乗っていますが、アセンブリが実際のDLL GACで(おそらくそうではありません)。

ただし、幸いなことに、T4ディレクティブでMSBuildマクロを使用できます。だから、おそらくあなたは次のようなものを得るでしょう

<#@ Assembly name="$(SolutionDir)Project.Common.WebApi\bin\Debug\Project.Common.WebApi.dll" #>

この構文の背景については、 [〜#〜] msdn [〜#〜] を参照してください。

import namespaceディレクティブも必要です。

最後に、プロジェクトのビルド順序に注意してください。 T4テンプレートを含むプロジェクトはProject.Common.WebApiに依存するようになったため、Project.Common.WebApiが最初にビルドされていることを確認する必要があります。そうしないと、T4テンプレートが誤って古いバージョンのアセンブリにリンクし、バグの追跡が非常に難しくなる可能性があります。

既にプロジェクトへの参照がある場合は、すべて完了です。ただし、依存関係を正しくセットアップする必要があります。 Visual Studioでこれを行うには、[プロジェクトの依存関係...]ダイアログを使用します。プロジェクトを右クリックして見つけます。

76
skrebbel

T4テンプレートを使用するプロジェクトにプロジェクトへの直接参照がある場合は、$(TargetDir)を使用できます

<#@ Assembly name = "$(TargetDir)Project.Common.WebApi.dll"#>

27
czlatea
<#@ Assembly name="$(TargetPath)" #>

それと同じくらい簡単。

21
mitaness