代码之家  ›  专栏  ›  技术社区  ›  Paul

对代码gen使用反射?

  •  5
  • Paul  · 技术社区  · 15 年前

    我正在编写一个控制台工具来为类库中的对象生成一些C代码。我可以实际生成代码的最佳/最简单的方法是在构建库之后使用反射。它工作得很好,但这充其量只是一种随意的方法。由于生成的代码将使用库进行编译,在进行更改后,我需要构建两次解决方案以获得最终结果,等等。其中一些问题可以通过构建脚本来缓解,但对我来说,这仍然有点太麻烦了。

    5 回复  |  直到 15 年前
        1
  •  2
  •   Ira Baxter    15 年前

    现在还不清楚您在做什么,但似乎很清楚的是您有一些基线代码,并且基于它的一些属性,您希望生成更多的代码。

    所以这里的关键问题是,给定基线代码,如何提取有趣的属性,以及如何从这些属性生成代码?

    事实上,可以从中提取真正任意代码属性的唯一工件是将源代码作为字符串(否则怎么回答呢,变量名中间的add运算符和T之间的字符数是质数?)。实际上,从字符串中获得的属性通常不是很有用(请参见我刚才给出的示例:)。

    他们已经确定了一些相对标准的“编译器数据结构”:抽象语法树(AST)、符号表(ST)、控制流图(CFG)、数据流事实(DFF)、程序三元组、庞特分析等。

    现在,在确定了感兴趣的属性之后,如何生成代码?在这里,编译人员一直非常关注机器代码的生成,以至于他们没有提供标准答案。这样做的人是程序转换社区( http://en.wikipedia.org/wiki/Program_transformation )。这里的想法是将程序的至少一种表示形式保留为AST,并为匹配源代码语法提供特殊支持(通过从感兴趣的代码片段构造模式匹配AST),并提供“重写”规则,有效地说,“当您看到此模式时,然后在此条件下用该模式替换它”。 通过将条件与编译器人员提供的各种属性提取机制相连接,您可以相对轻松地说出您希望得到的50年经验的支持。这种程序转换系统能够读入源代码,

    对于代码生成任务,您需要将基线代码读入AST,应用分析确定感兴趣的属性,使用转换生成新的AST,然后给出答案。

    为了使这样一个系统变得有用,它还必须能够解析和预打印各种源代码语言,以便C#爱好者以外的人也能从代码分析和生成中获益。

    这些想法都具体化了 DMS Software Reengineering Toolkit

        2
  •  2
  •   Community CDub    7 年前

    本教程似乎以数据库为中心,但可能会给您一些提示: http://www.olegsych.com/2008/09/t4-tutorial-creatating-your-first-code-generator/ 此外,T4上最近出现了一个Hanselminutes: http://www.hanselminutes.com/default.aspx?showID=170

    编辑:另一个好地方是StackOverflow上的T4标签: https://stackoverflow.com/questions/tagged/t4

    编辑:(由asker撰写,新发展)

    从VS2012开始,T4现在支持在单个步骤中对活动项目进行反射。这意味着您可以对代码进行更改,T4模板的编译输出将反映最新版本,而无需执行第二个反映/构建步骤。有了这个功能,我把它标记为可接受的答案。

        3
  •  1
  •   Chris McCall    15 年前

    CodeDom ,这样您只需构建一次。

    首先,我会阅读 this CodeProject article 确保不使用反射就无法支持特定于语言的功能。

        4
  •  0
  •   Robert Venables    15 年前

    据我所知,您可以使用公共编译器基础结构之类的东西( http://ccimetadata.codeplex.com/ )以编程方式分析现有的c#源代码。

        5
  •  0
  •   Orion Edwards    15 年前

    我不确定最好的方法,但你可以这样做

    • 作为基本dll的后期构建步骤,请运行代码生成器
    • csc msbuild 构建生成的dll

    • 其他依赖于生成的dll的内容也需要依赖于基本dll,因此构建顺序保持正确