2

我按照这篇文章Get Visual Studio to run a T4 Template on each build,使用带有 Visual Studio SDK 和 Visual Studio 2010 建模和可视化 SDK 安装的解决方案。

...但我得到一个我无法解决的错误:

错误 2 运行转换:System.ArgumentNullException:值不能为空。Parameter name: Could not obtain DTE from host at Microsoft.VisualStudio.TextTemplatingE035559D977B9B9858AB2036321BC47D.GeneratedTextTransformation.EntityFrameworkTemplateFileManager.VsEntityFrameworkTemplateFileManager..ctor(Object textTemplating) at Microsoft.VisualStudio.TextTemplatingE035559D977B9B9858AB2036321BC47D.GeneratedTextTransformation.EntityFrameworkTemplateFileManager.Create(Object textTransformation) at Microsoft.VisualStudio.TextTemplatingE035559D977B9B9858AB2036321BC47D Microsoft.VisualStudio.TextTemplating.TransformationRunner.RunTransformation 上的 .GeneratedTextTransformation.TransformText()(TemplateProcessingSession 会话,字符串源,ITextTemplatingEngineHost 主机,字符串和结果)。行=0,列=0 ApmWeb.Web。

按照我脚本的第一部分...

<#@ template language="C#" debug="false" hostspecific="true"#>
 <#@ include file="EF.Utility.CS.ttinclude"#>
 <#@ output extension=".cs"#><#

CodeGenerationTools code = new CodeGenerationTools(this);
 MetadataLoader loader = new MetadataLoader(this);
 CodeRegion region = new CodeRegion(this, 1);
 MetadataTools ef = new MetadataTools(this);

string inputFile = @"../../ApmWeb.Infrastructure.Data/Model/ApmWebModel.edmx";
 MetadataWorkspace metadataWorkspace = null;
 bool allMetadataLoaded =loader.TryLoadAllMetadata(inputFile, out metadataWorkspace);
 EdmItemCollection ItemCollection =     
   (EdmItemCollection)metadataWorkspace.GetItemCollection(DataSpace.CSpace);
 string namespaceName = code.VsNamespaceSuggestion();

EntityFrameworkTemplateFileManager fileManager =      
  EntityFrameworkTemplateFileManager.Create(this);

更新 我发现问题出在“EF.Utility.CS.ttinclude”这一点上......

dte = (EnvDTE.DTE) hostServiceProvider.GetService(typeof(EnvDTE.DTE));
        if (dte == null)
        {
            throw new ArgumentNullException("Could not obtain DTE from host");
        }

我的想法是在 VS 主机之外运行转换时无法获取 DTE 对象。例如,在 Team Build 中运行转换时会发生此错误(MSBuild 主机不“知道”DTE 对象)。实际上,它使用 VS 中的“运行自定义工具”工作,但正如我在上一篇文章中所说的那样配置自动 T4 构建,它不起作用。

那么怎么解决呢?它是 EF.Utility.CS.ttinclude 的错误吗?

更新 使用 DTE 删除与 VS 的交互(在 EF.Utility.CS.ttinclude 中定义 PREPROCESSED_TEMPLATE)一切正常,但我失去了将生成的文件添加到我的项目的能力……还有其他方法可以让它工作吗?

4

1 回答 1

0

正如您所发现的,在构建时进行转换时,您将无法访问 DTE。处理项目中未出现的生成代码的一种方法是将其包含在通配符中,例如

只要您使用标准输出命名约定,这应该会给您带来合理的体验。您还可以使用构建目标将生成的输出重定向到特定文件夹,然后使用更简单的通配符来包含文件夹中的所有内容。

您必须注意 IDE 中的手动调整将删除此通配符并将其替换为其评估的时间点结果。

于 2012-04-18T23:33:45.623 回答