2009-02-24 154 views
7

我正在寻找为项目创建小型生成器。我一直在阅读关于CodeDOM的内容,所以创建这些类的语义看起来不是一个问题,但我不确定如何最好地将这一代整合到开发和部署过程中。C#代码生成

  1. 我应该如何触发创建类?我已经读过它应该是构建过程的一部分,我应该怎么做?

  2. 应该在哪里创建类?我读过这些文件不应该手工编辑,并且从不检查源代码管理。我是否应该担心这个问题,并将这些类生成到与生成器引擎相同的目录中?

回答

0

您的问题的答案部分取决于您生成的课程的目的。

如果这些类是作为开发的一部分生成的,它们应该以文本文件的形式生成并像任何其他类一样签入SCM。

如果您的类是在运行时下动态生成的,作为系统操作的一部分,我根本不会使用CodeDOM。我会使用反射。

8

看看T4模板(它内置于VS2008)。它允许你创建“模板”类,为你生成代码。 Oleg Sych是一个非常宝贵的资源。

Link for Oleg's tutorial on code generation

+0

这是如何解决构建问题的? 我不确定这是蓝光的意思,但我想在我的编译中加入自动生成的代码...有一些生成C#类的IDL文件。现在,如果另一个团队成员改变了IDL,我想要重建我的C#类。做模板地址? – ripper234 2009-04-12 18:02:03

0

我知道T4模板的存在(并且知道很多人使用它们),但我自己并没有使用它们。除此之外,您还有两个主要选项:

  1. 使用SingleFileGenerator转换项目内部的源代码。每当您保存您编辑的文档时,它都会自动重新生成代码文件。如果使用源代码管理,生成的文件将作为项目的一部分签入。这有几个限制:
    • 您只能为每个输入生成一个输出。
    • 由于您无法控制生成文件的顺序,并且在生成时不生成文件,因此只能从单个输入文件中有效地生成输出。
    • 如果他们打算编辑输入文件,则必须在开发人员的机器上安装单个文件生成器。由于生成的代码在源代码控制中,因此如果它们不编辑输入,则不需要重新生成输出。
    • 由于输出仅在输入保存时生成,所以输出不应取决于输入文件的确切内容(甚至系统时钟)以外的任何状态。
  2. 生成代码作为构建的一部分。为此,您需要编写一个MSBuild目标文件。为此,您可以完全控制输入和输出,因此可以处理相关性。必要时可将系统状态视为输入依赖项,但请记住,每个需要代码生成的构建比使用先前生成的结果的构建需要更长的时间。结果(生成的源文件)通常放在obj目录中,并将其添加到输入列表csc(C#编译器)。此方法的局限性:
    • 编写目标文件比SingleFileGenerator更困难。
    • 构建依赖于生成输出,而不管用户是否将编辑输入。
    • 由于生成的代码不是项目的一部分,因此查看生成的代码以设置断点等事情会更困难。