C# 为什么使用ttinclude而不是编译的程序集?

C# 为什么使用ttinclude而不是编译的程序集?,c#,entity-framework,t4,tangible-t4-editor,clarius-visual-t4,C#,Entity Framework,T4,Tangible T4 Editor,Clarius Visual T4,我一直在编写一个程序集来简化我的POCO类型生成。我有一个核心程序集,其中包含多个tt文件并用于生成代码 我之所以这么做是因为无论我尝试哪种扩展(Devart T4、有形T4或Visual T4),都没有Visual Studio的C#编辑器提供的intellisense和支持那么好,因此用纯C#编写代码生成可以大大改善体验 我面临的最大问题是实体框架辅助类(例如,可访问性,代码生成工具,元数据工具等)是在ttinclude文件中定义的,而不是在程序集中定义的;目前,我必须重写这些类提供的许多功

我一直在编写一个程序集来简化我的POCO类型生成。我有一个核心程序集,其中包含多个tt文件并用于生成代码

我之所以这么做是因为无论我尝试哪种扩展(Devart T4、有形T4或Visual T4),都没有Visual Studio的C#编辑器提供的intellisense和支持那么好,因此用纯C#编写代码生成可以大大改善体验

我面临的最大问题是实体框架辅助类(例如,
可访问性
代码生成工具
元数据工具
等)是在ttinclude文件中定义的,而不是在程序集中定义的;目前,我必须重写这些类提供的许多功能,以便它可以从程序集中使用

我的问题是,为什么实体框架团队决定使用ttinclude文件而不是一些编译的程序集?使用Assemblys方法似乎在更多情况下更有用,并且仍然不会影响T4代码的生成(与使用
相反,它将是

我想知道解决这个问题的最佳方法是什么,我已经考虑过通过
textcransform.exe
运行
EF.Utility.CS.ttinclude
,然后获取生成的C#并编译它,这是否可取

谢谢,卢克

更新


目前我所做的是将
EF.Utility.CS.ttinclude
添加到我的项目中,将文件上的自定义工具设置为
TextTemplatingFilePreprocessor
。这将生成包含类的代码。然后我复制了这个cs文件,删除了负责编写输出的类(它有方法
TransformText()
),并编译成一个程序集。我现在可以在我的程序集中使用实体框架实用程序类。

使用
t包含
而不是程序集的原因与使用T4而不是自定义工具生成类的原因相同(这是您实际正在做的,也是大多数设计器以前使用的)。T4和
t可更改包含的内容。您可以复制
t包含
并创建小的更改,并将其包含在每个项目的T4主基础中


顺便说一句,你知道吗,有成千上万的程序员可以在没有任何智能感知的情况下编写代码;)对intellisense更糟糕的支持并不是放弃使用T4模板的理由。

我从未说过没有intellisense我无法编写代码,但我确实理解intellisense(以及代码重构、转到参考等)提供的好处。我仍然部分使用T4模板,我的程序集定义了从TextTransformation派生的类。必须根据情况更改ttinclude文件向我表明,所包含的类的设计或实现不够好,如果我们开始为每种情况复制和更改代码,就像说多态性不存在一样。在一个ttinclude文件中包含大量的类似乎违背了.NET采用的每个文件一个类的理念,如果我们将每个类拆分为其自己的ttinclude文件,那么顶部就有大量的
。如果试图重复使用代码(例如,必须使用相对路径,这可能会变得太长,或者必须编辑注册表才能使其工作),这一点尤其糟糕。另一个问题是包含的整个菱形问题,FileA包含FileB和FileC,FileB和FileC都包含field,现在文本转换失败,因为相同的类(来自field)被声明了两次。我认为使用包含共享类的程序集更可取。(如果我只是想解释我的推理,那么我很抱歉)我不认为T4及其包含的目的是提供.NET哲学。我的目的是让C#或VB.NET作为脚本语言,脚本修改而不是超大型超可重用的单个脚本更可取。我已经阅读并思考了你所说的,并最终同意了。我不想丢失T4脚本语法,所以我改变了我要采用的方法。我会接受你的回答,因为你让我重新思考这个问题:)