C# T4引擎无法识别当前项目命名空间

C# T4引擎无法识别当前项目命名空间,c#,.net,entity-framework-5,t4,self-reference,C#,.net,Entity Framework 5,T4,Self Reference,我正在使用VS2010(C#)T4模板生成代码 我需要迭代我的项目中的所有类型,短名单实体poco类并生成包装器。问题是,无法识别项目名称空间 以下是解决方案结构: namespace MySolution.Entities { public class Employee { ... } public class Department { ... } } // Seperate project referenceing MySolution.Entities. namespac

我正在使用VS2010(C#)T4模板生成代码

我需要迭代我的项目中的所有类型,短名单实体poco类并生成包装器。问题是,无法识别项目名称空间

以下是解决方案结构:

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.Database
{
公共部分类上下文:
System.Data.Entity.DbContext
{
公共{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模板处理器无法找到您的程序集

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

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

T4是一种与C#松散耦合的工具。这通常是一件好事;为了达到你想做的,我会用罗斯林。