2009-11-17 28 views
5

Actualmente estoy desarrollando una aplicación donde puede crear "programas" sin escribir código fuente, simplemente haga clic en & reproducir si lo desea.Generación de código dinámico

Ahora la pregunta es cómo puedo generar un programa ejecutable desde mi modelo de datos. Hay muchas posibilidades, pero no estoy seguro de cuál es la mejor para mí. Necesito generar ensamblajes con clases y espacio de nombres y todo lo que puede ser parte de la aplicación.

  1. Clase de CodeDOM: Escuché de muchas limitaciones y errores de esta clase. Necesito crear atributos en los parámetros del método y valores devueltos. ¿Esto es compatible?

  2. Cree el código fuente de C# mediante programación y luego llame a CompileAssemblyFromFile en él: Esto funcionaría ya que puedo generar cualquier código que desee y C# es compatible con la mayoría de las características de CLR. ¿Pero no sería esto lento?

  3. Usa la clase de reflexión ILGenerator: creo que con esto puedo generar todos los códigos .NET posibles. Pero creo que esto es mucho más complicado y propenso a errores que los otros enfoques.

  4. ¿Hay otras posibles soluciones?

EDIT: La herramienta es general para el desarrollo de aplicaciones, no está limitada a un dominio específico. No sé si se puede considerar un lenguaje de programación visual. El usuario puede crear clases, métodos, llamadas a métodos, todo tipo de expresiones. No será muy limitante porque debería poder hacer la mayoría de las cosas permitidas en los lenguajes de programación reales. Por el momento, el usuario debe escribir muchas cosas como texto, pero el objetivo al final es que se pueda hacer clic en casi todo.

+0

¿Puedes dar un ejemplo del tipo (o tipos) de "programas" que se crearán a partir de esto? –

+0

He actualizado la pregunta, consulte mi edición. – codymanix

+0

Todavía no puedo ver lo que intentas lograr: ¿es algo así como una DSL o estás tratando de crear un lenguaje de programación de alto nivel de uso general que se ejecute en C#? – glenatron

Respuesta

4

Creo que es gratificante mirar el Dynamic Language Runtime que está más o menos diseñado para crear lenguajes de alto nivel basados ​​en .NET.

Quizás también valga la pena mirar algunos de los Stack Overflow threads on Domain Specific Languages anteriores que contienen algunos enlaces útiles a herramientas para trabajar con DSL, que suena un poco como lo que está planeando aunque todavía no estoy absolutamente claro de la pregunta cuál es exactamente su el objetivo es.

+1

En particular, recomendaría ver el syml.doc (http://dlr.codeplex.com/Project/Download/FileDownload.aspx?DownloadId=74709) en el sitio web de DLR. En realidad, es un walktrough para crear su propio lenguaje sencillo utilizando Expression Trees y DLR. –

2

La mayoría de las cosas "hacer clic y jugar" deberían ser lo suficientemente simples como para unir algunos objetos de bloques de construcción predefinidos (probablemente usando interfaces en los límites). Significado: es posible que no tenga que hacer la generación de código dinámico, simplemente "falsificarlo". Por ejemplo, el uso de objetos propiedad de bolsa (como DataTable etc, aunque eso no es mi primera opción) para los valores, etc.

Otra opción para la evaluación dinámica es la clase Expression; especialmente en .NET 4.0, esto es enormemente versátil y permite la compilación a un delegado.

+0

Aunque solo haga clic y juegue, pero los usuarios pueden crear clases reales y miembros para él, también necesito un buen rendimiento, así que tengo que crear código "real". Con expresiones, solo puedo generar Expresiones, así que tengo que usarlo junto con codeDOM? – codymanix

+0

o con conjuntos dinámicos. He hecho ** montones ** de código dinámico, pero nunca he usado codeDOM –

+0

¿Así que sugieres Expression y Dynamic assemlies como reemplazo para codeDOM? ¿Esto dará como resultado un rendimiento similar (en tiempo de ejecución)? ¿Tiene un enlace web sobre cómo generar ensambles de esta manera? – codymanix

0

Depende de sus requisitos, CodeDOM sin duda sería la mejor opción para un "programa" almacenado en un "modelo de datos".

Sin embargo, es poco probable que el uso de la opción 2 sea de alguna manera considerablemente más lento en comparación con cualquier otro enfoque.

+0

Pero si la generación de fuente y la compilación no es más lenta que codeDOM, me pregunto por qué algo necesitaría codeDOM en absoluto, dado que es muy defectuoso y limitado. – codymanix

+0

Me interesaría que tu fuente de información sea "muy defectuosa" y limitada. Uno de los propósitos de CodeDOM es permitir a los diseñadores crear código usando un solo modelo y luego el CodeDOM se convierte a VB o CS o cualquier idioma que esté usando el proyecto de host. CodeDOM también se usa en cosas como Workflow Foundation para crear un archivo de reglas independiente del idioma. – AnthonyWJones

+0

Vea aquí: http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/61552792-76a9-45f0-8ea9-99d2f8b6f6f0 – codymanix

1

Haz la generación de la fuente C# y no te importa la velocidad hasta que importe. El compilador de C# es bastante rápido.

+0

Mi función de autocompletado también se basará en el ensamblado compilado, por lo que tiene sé amable en tiempo real ^^ – codymanix

+0

Puedes compilar cada clase en su propio ensamblaje. – erikkallen

1

Cuando escribí un generador de código dinámico, me basé en System.Reflection.Emit.

Básicamente, crea ensamblados dinámicos programáticamente y agrega nuevos tipos a ellos. Estos tipos se construyen utilizando las construcciones Emit (propiedades, eventos, campos, etc.). Cuando se trata de implementar métodos, deberá usar un ILGenerator para extraer los códigos de operación de MSIL en su método. Eso suena muy aterrador, pero se puede utilizar un par de herramientas para ayudar a:

  • Un ejemplo de implementación pre-construidos
  • ILDASM para inspeccionar los códigos de operación de la aplicación de la muestra.
0

Me haría eco de otros en que 1) el compilador es rápido, y 2) las cosas de "Hacer clic y reproducir" deberían ser lo suficientemente simples para que ningún widget añadido a una pila de widgets pueda convertirlo en una pila ilegal.

Buena suerte. Soy escéptico de que puedas alcanzar el punto (2) para cualquier cosa que no sean programas de nivel de juguete.