T4模板调试正常,但在正常运行模式下出错

本文关键字:正常运行 模式 出错 调试 T4 | 更新日期: 2023-09-27 18:26:54

我从头开始创建了一个T4模板来生成DTO类。直到昨天,它一直按预期运行,直到我添加了对DbContext类的调用,如下所示:

using (var context = new TenantDbContext())
{
    var entityObjects = ((IObjectContextAdapter) context).ObjectContext.MetadataWorkspace.GetItems<EntityType>(DataSpace.OSpace);
    // Processing...
}

现在,当模板构建通过保存触发时,或者当它通过项目构建触发时,它会停止,并出现以下错误:

Running transformation:
System.EntryPointNotFoundException: Entry point was not found.    at
System.Data.Entity.Infrastructure.IObjectContextAdapter.get_ObjectContext()
at
Microsoft.VisualStudio.TextTemplating4060E50565D24E6D60BA3E80DDCE2A21E9485A5F4982CD591645549489576DC7687B06DE6C675CAA51175F177B32340E9E07C1C8B0487B2BD65D022D75892D00.GeneratedTextTransformation.TransformText()

奇怪的是,当我调试模板时,它工作得很好!我一直不知道为什么,也没有找到其他有类似问题的人。如有任何建议,我们将不胜感激。

该文件的导入如下:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ Assembly Name="System.Data" #>
<#@ assembly name="System.Data.Entity.Design" #>
<#@ assembly name="$(SolutionDir)packages'EntityFramework.6.1.3'lib'net45'EntityFramework.dll" #>
<#@ assembly name="$(SolutionDir)packages'EntityFramework.6.1.3'lib'net45'EntityFramework.SqlServer.dll" #>
<#@ assembly name="$(SolutionDir)ProjectName.Enties'bin'Debug'ProjectName.Enties.dll" #>
<#@ assembly name="$(SolutionDir)HouseOfSynergy.PowerTools.Library'bin'Debug'HouseOfSynergy.PowerTools.Library.dll" #>
<#@ assembly name="$(SolutionDir)ProjectName'bin'Debug'ProjectName.DataLayer.dll" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Collections.ObjectModel" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.Entity.Core.Metadata.Edm" #>
<#@ import namespace="System.Data.Entity.Core.Objects" #>
<#@ import namespace="System.Data.Entity.Design.PluralizationServices" #>
<#@ import namespace="System.Data.Entity.Infrastructure" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="ImagineCapture.Enties" #>
<#@ import namespace="ImagineCapture.DataLayer" #>
<#@ import namespace="ImagineCapture.DataLayer.Contexts" #>
<#@ output extension=".cs" #>

我知道所有引用的程序集都存在于它们指定的路径上,并且都是最新构建的。它在调试时确实有效。

环境:

  • VS 2013终极版
  • ASP.NET Web应用程序
  • 实体框架6.3.1
  • .NET 4.5
  • Windows 8.1(64位)

T4模板调试正常,但在正常运行模式下出错

T4模板引用了同一解决方案中的一个项目(尽管该项目出现在构建周期的早期)。

使用"调试"解决方法一段时间后,脑海中浮现出两个原因:

  • 正常运行模板时,T4主机会在VS生成周期释放引用的程序集之前,尝试获取这些程序集的锁
  • 当在Debug中运行模板时,T4主机有足够的时间获取所需的锁,但未能:(1)触发内部垃圾收集以释放引用的程序集,或:(2)未能作为进程本身终止(尽管我在任务管理器中没有将其视为单独的进程)