无需自定义工具即可以编程方式添加模板文件

时间:2013-08-01 12:19:04

标签: visual-studio code-generation transformation envdte customtool

我们在Visual Studio的项目中添加了T4模板文件(tt和ttinclude的)的结构。

对于这些模板,我们使用自定义转换和处理,我们不希望tt文件的自定义工具设置默认情况下设置为 TextTemplatingFileGenerator 。 / p>

为了实现这一点,我们使用以下代码:

... // 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;

但是TaskList不包含这些错误 - 可能是因为它们是转换错误而不是编译错误。

更奇怪的是DTE.Events.TaskListEvents.TaskAdded事件是针对每个转换错误触发的,但是它们在TaskList中找不到。同样调用从TaskAdded事件中获取的错误的Delete()方法也不会将它们从错误列表中删除。

我们还尝试以编程方式浏览文件或保存模板但不会像手动操作那样刷新错误列表。

当我们将模板添加到项目中时,如何刷新ErrorList或告诉Visual Studio不要添加自定义工具设置?

P.S。我们不想强制构建客户的项目(它正在删除错误,但它不适用于我们)。

1 个答案:

答案 0 :(得分: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.
#>

然后在删除自定义工具设置后,我们将内容替换为真实内容,并且所有内容都按预期工作,因为文件已经在项目中,没有自定义工具没有任何其他转换。

不是最好的解决方案,但我们无法找到更好的解决方案。我希望这会有所帮助。