Skip to main content
 首页 » 编程设计

c#之T4 引擎无法识别当前项目 namespace

2024年07月26日11bjzhanghao

我正在使用 VS 2010 (C#) T4 模板来生成代码。

我需要迭代项目中的所有类型,列出实体 poco 类并生成包装器。问题是,项目 namespace 未被识别。

这是解决方案结构:

namespace MySolution.Entities 
{ 
    public class Employee { ... } 
    public class Department { ... } 
} 
 
// Seperate project referenceing MySolution.Entities. 
namespace MySolution.Database 
{ 
    public partial class Context { ... } 
 
    // Should generate Context.cs as a partial class with after iterating Syste.Types available in MySolution.Entities. 
    Context.tt 
} 

这是文本模板:

<#@ template language="C#" #> 
<#@ Output Extension=".cs" #> 
 
namespace MySolution.Database 
{ 
    public partial class Context: 
        System.Data.Entity.DbContext 
    { 
<# 
System.Type [] types = typeof(MySolution.Entities).Assembly.GetTypes(); 
for (int i=0; i < types.Count; i++) 
#> 
        public <#= types[i].Name; #> <#= types[i].Name; #> { get; set; } 
    } 
} 

上面的代码生成错误:找不到类型或命名空间“MySolution”。您是否缺少 using 指令或程序集引用?然后我输入以下代码行来包含程序集:

<#@ Assembly Name="..\MySolution.Entities\bin\x86\Release\MySolution.Entities.dll" #> 

现在它给了我一个不同的错误:主机在尝试解析程序集引用“..\..\..TrafficMonitor.Core\bin\x86\Release\TrafficMonitor.Library.dll”时抛出异常。转换将不会运行。抛出以下异常: System.IO.FileLoadException:给定的程序集名称或代码库无效。 (HRESULT 异常:0x80131047)

关于如何克服这个限制有什么想法吗?

请您参考如下方法:

该错误是因为 T4 模板处理器无法找到您的程序集。

如果您在 T4 模板的 Assembly 指令中使用程序集的完整路径,它应该找到该程序集。使用完整路径的更好方法是使用 Visual Studio 宏变量之一,例如 $(SolutionDir),该变量将在执行 T4 模板时展开。

<#@ Assembly Name="$(SolutionDir)MySolution.Entities\bin\x86\Release\MySolution.Entities.dll" #>