2009-02-24 20 views
7

Estoy buscando crear un pequeño generador de clases para un proyecto. He estado leyendo sobre CodeDOM por lo que la semántica de crear las clases no parece ser un problema, pero no estoy seguro de cómo integrar mejor la generación en el proceso de desarrollo e implementación.C# Code Generation

  1. ¿Cómo debo activar la creación de las clases? He leído que debería ser parte del proceso de compilación, ¿cómo debo hacer esto?

  2. ¿Dónde deberían crearse las clases? Leí que los archivos no deben editarse a mano, y nunca deben verificarse en el control de fuente. ¿Debo preocuparme por esto y simplemente generar las clases en el mismo directorio que el motor del generador?

Respuesta

0

Las respuestas a su pregunta dependen en parte del objetivo de las clases generadas.

Si las clases se generan como parte del desarrollo , deben generarse como archivos de texto y registrarse en su SCM como cualquier otra clase.

Si sus clases se generan dinámicamente en runtime como parte del funcionamiento de su sistema, no utilizaría CodeDOM en absoluto. Yo usaría Reflection.

8

Eche un vistazo a las plantillas T4 (está incorporada en VS2008). Le permite crear clases de "plantilla" que generan código para usted. Oleg Sych es un recurso invaluable para esto.

Link for Oleg's tutorial on code generation.

+0

¿Cómo soluciona los problemas de compilación? No estoy seguro de que esto sea lo que significaba blu, pero quiero incorporar código autogenerado en mi compilación ... tengo algún archivo IDL que genere clases C#. Ahora, si otro miembro del equipo cambió el IDL, quiero que mi clase C# sea reconstruida. ¿La dirección de la plantilla es esa? – ripper234

+0

Las plantillas T4 se pueden configurar para generar clases en cada compilación. No requiere mucho tiempo, y es una buena práctica. –

+0

@Michael: los archivos nunca se deben regenerar innecesariamente, ya que ralentiza la compilación. Todo lo que ralentiza una construcción se acumula y se siente una y otra vez. Créanme cuando digo que este problema es más fácil de prevenir que corregir después de que esté bien establecido en la compilación. –

0

Sé de la presencia de plantillas T4 (y sé que mucha gente las usa), pero no las he usado yo mismo. Aparte de eso, tiene dos opciones principales:

  1. Use un SingleFileGenerator para transformar la fuente directamente dentro del proyecto. Siempre que guarde el documento que edita, automáticamente regenerará el archivo de código. Si usa el control de fuente, el archivo generado se registrará como parte del proyecto. Existen algunas limitaciones con esto:
    • Solo puede generar una salida para cada entrada.
    • Dado que no puede controlar el orden en que se generan los archivos, y los archivos no se generan en el momento de la compilación, su salida solo se puede derivar efectivamente de un solo archivo de entrada.
    • El generador de archivos único debe instalarse en la máquina del desarrollador si planea editar el archivo de entrada. Como el código generado está en control de fuente, si no editan la entrada, entonces no necesitarán regenerar la salida.
    • Como la salida se genera solo cuando se guarda la entrada, la salida no debe depender de ningún estado que no sea el contenido exacto del archivo de entrada (incluso el reloj del sistema).
  2. Generar código como parte de la compilación. Para esto, escribe un archivo de objetivos MSBuild. Para esto, tiene control total de entrada (s) y salida (s) para que las dependencias puedan ser manejadas. El estado del sistema se puede tratar como una dependencia de entrada cuando sea necesario, pero recuerde que cada compilación que requiere generación de código lleva más tiempo que una compilación que usa un resultado generado anteriormente.Los resultados (archivos fuente generados) generalmente se colocan en el directorio obj y se agregan a la lista de entradas que van al csc (el compilador C#). Limitaciones de este método:
    • Es más difícil escribir un archivo de objetivos que un SingleFileGenerator.
    • La construcción depende de generar la salida, independientemente de si el usuario va a editar la entrada.
    • Como el código generado no es parte del proyecto, es un poco más difícil ver el código generado para cosas como establecer puntos de interrupción.