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

T4 Template debugging fine but errors out in normal run mode

我从头开始创建了一个 T4 模板来生成 DTO classes。直到昨天,在我按如下方式添加对 DbContext class 的调用之前,它一直按预期运行:

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

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

环境:

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

使用 'Debug' 解决方法一段时间后,我想到了两个原因:

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