2008-09-30 4 views
5

Utilizamos DesignSurface y todo ese buen IDesignerHost bondad en nuestro propio diseñador. Los formularios diseñados se conservan en nuestro propio formato a medida y todo funciona muy bien. También queremos exportar los formularios a un formato basado en texto (lo que hemos hecho ya que no es tan difícil).¿Existe alguna forma de convertir el código fuente en una CodeCompileUnit?

Sin embargo, también queremos importar ese texto de vuelta a un documento para el diseñador que implica volver a introducir el código del diseñador en una CodeCompileUnit. Desafortunadamente, el método de Parse no está implementado (por, sin duda, buenas razones). ¿Hay una alternativa? No queremos usar nada que no exista en una instalación .NET estándar (como las bibliotecas .NET instaladas con Visual Studio).

Mi idea actual es compilar el texto importado y luego crear una instancia del formulario y copiar sus propiedades y controles en el objeto de superficie de diseño, y simplemente capturar la nueva CodeCompileUnit, pero esperaba que hubiera una mejor manera. Gracias.


ACTUALIZACIÓN: Creo que algunos podrían estar interesados ​​en nuestro progreso. Hasta ahora, no muy bien. Una breve descripción de lo que descubrí es que el método Parse no se implementó porque se consideró demasiado difícil, existen analizadores de código abierto que hacen el trabajo pero no están completos y por lo tanto no se garantiza que funcionen en todos los casos (NRefactory es uno de los del proyecto SharpDevelop, creo), y la copia de controles desde una instancia hasta el diseñador aún no funciona. Creo que esto se debe a que, aunque los controles se agregan a la instancia del formulario que la superficie del diseñador envuelve, la superficie del diseñador no está al tanto de su inclusión. Nuestro próximo intento es imitar cortar/pegar para ver si eso lo resuelve. Obviamente, esta es una gran solución desagradable, pero necesitamos que funcione para que podamos aprovechar el éxito y estar atentos a las alternativas.

+0

Me encantaría saber la respuesta, también, pero mi temor es que no haya ninguno. – ZeroBugBounce

+0

Realmente estoy buscando una solución para esto también. Me gustaría fusionar nuevas funciones al código existente fácilmente, de preferencia mediante el análisis de un archivo de código, y luego agregar nuevos miembros, después de lo cual crearía el script desde CodeCompileUnit fusionada. – Statement

Respuesta

2

Siempre puede escribir su propio analizador de C#. De esa manera, puedes estar seguro de que está completo.

En su caso, debido a que no necesita nada como intellisense, probablemente pueda salirse con la suya con solo usar un generador de analizador sintáctico.

Incluso si escribió una a mano, sin embargo, probablemente no le llevaría más de un mes.

+0

Esperaba evitar tener que hacer este esfuerzo. El problema es el tiempo: esta función, aunque es necesaria, no es lo suficientemente importante como para justificar la inversión de tiempo para escribir un analizador de lenguaje. Aún así lo estoy considerando. –

+0

En general, el VS CodeDom es bastante incompleto. No se ha mantenido al día con los cambios de idiomas desde V7. Creo que, por el bien de su producto, probablemente deba escribir su propio analizador. Es la única forma en que se asegurará de que pueda responder a los futuros cambios de idioma. –

2

No es exactamente lo que solicitó, pero podría intentar usar la clase CodeDomComponentSerializationService para generar el gráfico CodeDom en función del estado actual de la superficie de diseño.

Usamos esa clase para manejar la funcionalidad copiar/pegar en nuestro diseñador incorporado.

+0

Sí, ya hacemos esto para sacar la fuente de la superficie, pero queremos volver a colocar la fuente en la superficie, lo que está causando el problema. –

Cuestiones relacionadas