[英]Can't reference an assembly in a T4 template
我在主程序集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");
但我真的不喜歡這個,因為我想在各種項目中使用這個模板,而我只是簡單地討厭重復,尤其是魔術字符串。
<#@ assembly name="$(ProjectDir)bin\Debug\ProofOfConcept.dll" #>
快樂的編碼!
要在VS2010中引用T4模板中的裝配,您有一些選擇:
- GAC您的程序集並使用命名空間參考或完全限定類型名稱
- 使用硬編碼的完全合格的UNC路徑
- 將程序集復制到Visual Studio“公用程序集文件夾”,並使用命名空間參考或完全限定類型名稱。
- 使用或定義Windows環境變量以構建完全限定的UNC路徑。
- 使用Visual Studio宏來構建完全限定的UNC路徑。
我建議你在公共程序集文件夾中放置一個引用的程序集,另一個,甚至更好的解決方案是硬編碼引用程序集的路徑。
關於此主題的非常好的帖子: T4模板錯誤 - Assembly Directive無法在Visual Studio 2010項目中找到引用的程序集。
基本上MS決定制動改變,項目參考組件也不被T4引擎參考。
T4的裝配集與包含項目的裝配集完全分離,以避免在項目針對以前的框架版本時拾取錯誤的裝配。 項目程序集不再用於解析模板程序集指令。
當我嘗試在我的Web項目中包含Less Css for .NET時,我遇到了類似的問題。
我最終將程序集復制到項目的根文件夾中,並將其作為項目本身的參考。 然后,我在.tt文件中添加了以下行:
<#@ assembly name="dotless.Core.dll" #>
<#@ import namespace="dotless.Core" #>
<#@ import namespace="dotless.Core.configuration" #>
我確信類似的東西也適用於你的裝配......
我發現在創建和使用gax工具包和包中存在許多情況,其中構建對引用結構的方式非常滿意,但運行時因為無法找到它所尋找的內容而煩惱 - 通常當主程序集引用使用gax元素的程序集然后該程序集依次引用主程序集不引用的另一個程序集時發生。
嘗試直接在主程序集中包含有問題的程序集 - 並考慮您可能需要編寫后期構建指令以將其移動到“預期”位置 - 而在某種情況下,它應該勝過必須硬連接路徑。
因人而異
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.