web-dev-qa-db-ja.com

T4テンプレートでアセンブリを参照できません

メインアセンブリのテスタークラスPocoGeneratorに次のコードがあります。このアセンブリは、T4テンプレートを使用して、参照されるアセンブリ(プロジェクト参照)DataObjectsのL2Sエンティティに基づいてPOCOを生成することになっています。

var assemblyName = "DataObjects";
var dataObjects = AppDomain.CurrentDomain.Load(new AssemblyName(assemblyName));

できる限り試してみてください。T4でDataObjectsアセンブリを見つけることができません。次のようなさまざまな形式のAssemblyディレクティブを試しました。

<#@ Assembly name="DataObjects" #>
<#@ Assembly name="DataObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" #>

無駄に。上記のコードはテスタークラスでは機能しますが、テンプレートでは機能しません。私は何が間違っているのですか?

追加:この問題は、参照するボットの場所にあるアセンブリへの絶対パス、ディレクティブ、およびクラス機能ブロックを使用して解決しました。

<#@ Assembly name="C:\Development\PocoGenerator\DataObjects\bin\Debug\DataObjects.dll" #>

そして

var sourceAssembly = Assembly.LoadFile(@"C:\Development\PocoGenerator\DataObjects\bin\Debug\DataObjects.dll");

しかし、このテンプレートをさまざまなプロジェクトで使用したいので、私はこれが本当に好きではありません。特にマジックストリングの複製が嫌いです。

31
ProfK
<#@ Assembly name="$(ProjectDir)bin\Debug\ProofOfConcept.dll" #>

ハッピーコーディング!

54
Eric

VS2010のT4テンプレートでアセンブリを参照するには、いくつかのオプションがあります。

  1. アセンブリをGACし、名前空間参照または完全修飾型名を使用します
  2. ハードコードされた完全修飾UNCパスを使用する
  3. アセンブリをVisualStudioの「パブリックアセンブリフォルダー」にコピーし、名前空間参照または完全修飾型名を使用します。
  4. Windows環境変数を使用または定義して、完全修飾UNCパスを作成します。
  5. Visual Studioマクロを使用して、完全修飾UNCパスを作成します。

参照されるアセンブリをパブリックアセンブリフォルダーに配置することをお勧めします。別の、おそらくさらに良い解決策は、参照されるアセンブリのパスをハードコーディングすることです。

このトピックに関する非常に素晴らしい投稿: T4テンプレートエラー-アセンブリディレクティブは、Visual Studio 2010プロジェクトで参照されているアセンブリを見つけることができません。

基本的に、MSはブレーキの変更を決定し、プロジェクトで参照されているアセンブリはT4エンジンでも参照されていません。

T4のアセンブリセットは、プロジェクトが以前のフレームワークバージョンを対象としているときに間違ったアセンブリを取得しないように、含まれているプロジェクトのアセンブリセットから完全に分離されています。プロジェクトアセンブリは、テンプレートアセンブリディレクティブの解決には使用されなくなりました。

詳細: Visual Studio 2010のT4の新機能

14
Peter Stegnar

Webプロジェクトに Less Css for .NET を含めようとしたときに、同様の問題が発生しました。

プロジェクトのルートフォルダーにあるアセンブリをコピーして、プロジェクト自体の参照として含めることになりました。次に、.ttファイルに次の行を追加しました。

<#@ Assembly name="dotless.Core.dll" #>

<#@ import namespace="dotless.Core" #>
<#@ import namespace="dotless.Core.configuration" #>

同様のことがあなたのアセンブリでも機能するはずです...

1
Regent

Gaxツールキットとパッケージを作成して使用する場合、ビルドは参照の構造に完全に満足しているが、探しているものが見つからないためにランタイムがすべて煩わしい場合がいくつかあります-これは通常ですメインアセンブリがgax要素を使用するアセンブリを参照し、次にそのアセンブリがメインが使用しない別のアセンブリを参照する場合に発生します。

問題のアセンブリをメインのアセンブリに直接含めてみてください-そして、それを「予想される」場所に移動するためにビルド後の指示を書く必要があるかもしれないと考えてください-厄介ですが、パスを配線する必要はありません。

YMMV

0
Mark Mullin