我按照这篇文章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)一切正常,但我失去了将生成的文件添加到我的项目的能力……还有其他方法可以让它工作吗?