2013-04-12 56 views
3

所有導入的命名空間,T4模板:在主機裝配

我有一個T4模板

<#@ template debug="true" hostSpecific="true" #> 
<#@ output extension=".cs" #> 
<#@ Assembly Name="System.Core" #> 
<#@ Assembly Name="System.Windows.Forms" #> 
<#@ import namespace="System" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Diagnostics" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Collections" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="MyLibrarysRootNameSpace.SomeNamespace" #> 
/*Rest of template follows*/ 

我試圖獲得最後一行導入,這樣我可以很容易地resuse在其他此模板項目,但我似乎錯過了一些東西。我正在嘗試做什麼?如果是這樣,怎麼樣?

+0

「System.Core」和「System.Windows.Forms」程序集都不包含名稱空間「MyLibrarysRootNameSpace.SomeNamespace」,所以顯然導入失敗。你究竟想達到什麼目的? – dtb

+0

MyLibrarysRootNameSpace.SomeNamespace引用包含我自己代碼中的類定義的名稱空間。它是主機項目的一部分,不屬於任何系統命名空間(這就是爲什麼我以單詞My開頭) – William

回答

8

導入只是添加使用語句,它不引用程序集。 T4的引用程序集集合與託管模板的項目完全脫節。

如果你想引入你的主機項目的程序集,那麼你需要一個程序集指令來完成它。像下面這樣:

<#@集名稱=「$(TARGETPATH)」#>

請注意,您在這裏引入一個構建循環,因此該項目將需要手動干預來構建,直到它已經產生一個DLL一次,因此請確保您只生成可選的部分或始終可以使用以前的簽入版本。

+0

我會將其標記爲答案,即使正如你所說,它會導致構建循環。發現我認爲我需要的類型比較並不是那麼重要。 – William

+0

*導入只是添加使用語句*。要清楚,它會導入一個名稱空間;它不會將使用語句寫入輸出文件。 (可能是你的意思。) –

+0

它將using語句添加到被編譯和執行以生成輸出文件的中間代碼中。 – GarethJ

1

如果我理解正確你的問題:

複製 - 粘貼前2段from there以獲取包含T4項目的EnvDTE對象模型:

<#@ assembly name="EnvDte" #> 
<# 
    var visualStudio = (this.Host as IServiceProvider) 
     .GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; 
    var project = visualStudio.Solution 
     .FindProjectItem(this.Host.TemplateFile) 
     .ContainingProject as EnvDTE.Project; 
#> 

然後,使用the method from there獲得該項目的默認命名空間:

// project is of type: EnvDTE.Project 
string strDefaultNamespace = project.Properties.Item("DefaultNamespace") 
    .Value.ToString(); 

然後,使用strDefaultNamespace值,但是你喜歡。

+0

種類。我希望將它作爲一個指令,然後是一個字符串文字。 – William

+0

這將得到命名空間,但程序集仍未被引用。 – GarethJ

+0

您可以使用System.IO.StreamWriter類編寫單行ImportDefaultNamespace.tt文本文件,然後使用'<#@ include'指令來包含該文件。 但是,我沒有看到這樣做的任何價值。跨項目複製粘貼源代碼文件本身幾乎不是一個好習慣(共享程序集通常效果更好),但是您還必須在複製粘貼的源代碼文件中編輯名稱空間? – Soonts