3

我們在Visual Studio的項目中添加了T4模板文件(tt和ttinclude)的結構。添加沒有自定義工具的模板文件以編程方式進行投影

對於這些模板,我們使用我們的自定義轉換和處理,我們不希望自定義工具設置在默認情況下被設置爲TextTemplatingFileGenerator的TT文件。

爲了實現這一目標,我們用下面的代碼:

... // logic for the files creation 
ProjectItem addedItem = this.project.ProjectItems.AddFromFile(fileFullPath); 
addedItem.Properties.Item("CustomTool").Value = string.Empty; 

的問題是,當文件被添加到項目中的代碼生成是由默認的自定義工具造成的,即使我們刪除從tt文件的屬性來看,轉換造成的錯誤仍然在錯誤列表中(類似於視覺問題)。

只要您保存文件,導航到其他文件或構建項目,它們就會消失,但我們不希望我們的用戶看到這些錯誤並做出任何其他操作來擺脫它們。

我們嘗試使用DTE和DTE2類訪問錯誤集合類似

DTE2 dte2 = (DTE2)this.project.DTE; 
dte2.ToolWindows.TaskList; 

或讓他們從ErrorListProvider提供商爲

var provider = new ErrorListProvider(this.ServiceProvider); 
var tasks = provider.Tasks; 

但任務列表不包含這些錯誤 - 可能原因是他們是轉化錯誤而不是編譯錯誤。

更奇怪的是,DTE.Events.TaskListEvents.TaskAdded事件觸發了每個轉換錯誤,但它們無法在TaskList中找到。同時調用從TaskAdded事件獲得的錯誤的Delete()方法不會將它們從錯誤列表中刪除。

我們還嘗試以編程方式導航文件或保存tamplates,但不像刷手動那樣刷新錯誤列表。

當我們將模板添加到項目中時,我們該如何刷新ErrorList或告訴Visual Studio不要添加自定義工具設置?

P.S.我們不想強制客戶項目的構建(這是刪除錯誤,但它不適用於我們)。

回答

1

我們發現了一個骯髒的解決方法來擺脫錯誤。

我們生成模板文件及其基本模板內容(下圖),該模板文件對默認的TextTemplatingFileGenerator有效,且初始代碼生成不會導致任何錯誤。

<#@ template debug="true" hostSpecific="true" #> 
<#@ output extension=".cs" #> 
<#@ Assembly Name="System.Core" #> 
<#@ Assembly Name="System.Windows.Forms" #> 
<#@ import namespace="System" #> 
<# 
    // This is a temporary content valid for the TextTemplatingFileGenerator. 
#> 

然後除去自定義工具設置之後,我們更換了與真實的內容和一切工作按預期,因爲這些文件已經在項目沒有任何其他轉換,而不自定義工具。

不是最好的解決方案,但我們無法找到更好的解決方案。我希望這有幫助。

相關問題