3

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

对于这些模板,我们正在使用我们的自定义转换和处理,我们不希望 tt 文件的自定义工具设置默认设置为TextTemplatingFileGenerator

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

... // 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 不要添加自定义工具设置?

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

4

1 回答 1

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.
#>

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

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

于 2013-08-01T16:10:04.283 回答