简单&实用的C#代码生成(VS 2008或2010)

时间:2009-11-12 14:26:56

标签: c# visual-studio code-generation t4

我推迟使用生成的代码作为构建过程的一部分,因为担心它会在构建过程中引入复杂性。

有没有一种简单的方法可以将构建时生成的代码集成到应用程序中?

我想到的代码类型类似于Visual Studio执行的资源和设置文件代码生成:

  • 这里有智能感知是有价值的
  • 属性之间有很多属性和链接,这些属性和链接很容易描述,但不可能在C#中简洁地实现。
  • 底层资源是可修改的,代码会自动重新生成,无需任何用户交互,也无需了解生成器的内部。

对于(非现实世界)示例,请考虑通过类似命名的C#属性(或方法)生成对Regex的命名捕获组的访问者的预编译器。这是我想要生成的各种事物的典型:样板包装器的长片段,其主要功能是启用编译时检查错误(在上面;访问不存在的捕获组或写入和无效的正则表达式)和否不太重要的是,这些属性的智能感知。最后,这个设置应该可以由团队中的其他人轻松使用,只有极少的学习曲线。即,要求手动干预以重新生成代码是绝对不可接受的,也不能将生成的代码提交到源代码控制中。在最坏的情况下,每个人都应该只需要安装一些扩展;理想情况下,扩展应该可以安装到源树中,这样任何签出树的人都可以在没有任何介绍的情况下构建项目。

为了使其运行良好,IDE集成非常重要:更新底层“资源”定义文件应触发代码的重新生成而无需任何用户交互,理想情况下,生成器本身以后很容易为其他开发人员维护(即一些发电机调试能力是一个加号)。

最后,类似XSLT的方法是相同的模板可以应用于各种输入资源是理想的;因为这意味着你甚至不需要查看实际的生成器代码,如果你想要做的就是更新资源,并且因为它使模板重用变得微不足道。

我看过T4,但从我看到的这个有一个不太方便的ASP式方法,模板和资源没有干净地拆分(即,生成器负责找到资源 - 这使模板重用变得不那么容易了。)

是否有更好(更干净)的解决方案或运行T4的某种方式,以便可以轻松地重复使用相同的模板,并且(很像.NET设置文件)任何资源更新都会自动触发已实现代码的重新生成?

要点: 我正在寻找可以

的代码方法
  1. 当基础资源(不是模板!)发生变化时,无需开发干预即自动重新生成代码。
  2. 维护起来有点简单
  3. 能够在多个资源之间共享相同的生成器模板(其中,#1点可能意味着资源应该引用生成器,反之亦然)。

2 个答案:

答案 0 :(得分:6)

您可以使用T4 Toolbox中的T4ScriptFileGenerator。将“资源”文件的“自定义工具”属性更改为T4ScriptFileGenerator并保存更改。自定义工具将生成一个新的空T4脚本(.tt文件)。将代码生成逻辑放在此.tt文件中。每次修改(并保存)资源文件时,T4ScriptFileGenerator都将使用.tt文件生成输出代码。有关其工作原理的示例,请参阅T4工具箱中的“LINQ to SQL Model”生成器,该生成器使用.dbml文件作为“资源”。在这个生成器创建的.tt文件中,您将看到所有代码生成逻辑都驻留在单独的.tt文件中,并在include指令的帮助下重用。

答案 1 :(得分:0)

您可能需要关注ABSE(http://www.abse.info)。 ABSE是一种代码生成和模型驱动的软件开发方法,在平台和语言方面完全不可知,因此您不必为C#和您希望的任何其他内容创建自己的生成器。最重要的是,您可以按照自己的方式生成代码。缺点是您可能需要做更多工作才能构建模板。

ABSE允许您将您的领域知识捕获到“Atoms”中,这些基本上是您可以构建的大型模型的片段。 ABSE既是声明性的,也是可执行的。该模型能够按照您的规范生成代码,并在模型级别包含自定义代码。

不幸的是,ABSE仍在进行中,集成开发环境(名为AtomWeaver)仍在制作中。无论如何,发电机的CTP版本计划于2010年1月发布,所以我们已经接近它了。