2009-09-05 20 views
8

Parece que a .NET CF le falta el muy útil Reflection.Emit. Hasta ahora, encontré esta biblioteca como una alternativa: http://www.codeplex.com/EmitCF.Alternativas a Reflection.Emit para Compact Framework

Sin embargo, parece ser una versión anterior abandonada, por lo que estoy buscando más opciones.

¿Alguien sabe de otra alternativa a Emit? O tal vez alguien usó EmitCF y puede comentar sobre su estado?

Por cierto, el cuadro más grande: Estoy intentando conseguir Emit para la CF, por lo que puedo conseguir http://dynamic.codeplex.com a trabajar bajo la CF, por lo que puede optimizar el código de serialización que estoy usando (http://www.codeproject.com/KB/XML/GR_CustomXmlSerializer.aspx)

+1

¿La serialización a XML es un requisito estricto? De lo contrario, podría ver la serialización binaria con algo como prot-buf. – ctacke

+0

Sí, se requiere serialización basada en texto. Descubrí que es la única forma práctica de asegurarme de poder migrar fácilmente mis datos a nuevas versiones de mis programas. – Hermit

Respuesta

5

Lo que necesita es Cecil (http://mono-project.com/Cecil), una biblioteca de proyectos Mono para generar e inspeccionar programas y bibliotecas en formato CIL. Se mantiene activamente, hace mucho más que Reflection.Emit y se usa en muchos proyectos, incluidos algunos que apuntan a .NET CF.

+0

EmitCF se basa en Cecil ... Sin embargo, voy a echar un vistazo más de cerca a Cecil, es una buena idea. La última versión de Cecil que puedo encontrar es 0.6, desde 2007. ¿Hay otras más nuevas? – Hermit

+0

Desde entonces Cecil se ha movido al núcleo Mono, por lo que las últimas versiones se distribuyen con las bibliotecas de clase Mono. La fuente está en http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/Mono.Cecil/, y si descarga Mono, se incluirá Mono.Cecil.dll. –

1

Esto no es exactamente una respuesta a su pregunta, pero como Reflection.Emit no es compatible con CF, un enfoque alternativo que podría tomar para la serialización/deserialización sería compilar sus clases en una aplicación normal de Windows, y utilice Reflection.Emit para generar programáticamente métodos de serialización y de-serialización para cada clase, que luego podrían incorporarse nuevamente a la clase en la versión de CF. Básicamente, usaría Reflection.Emit en el marco completo para la generación de código.

Esto sería más trabajo (y una fuente constante de más trabajo, por supuesto), pero funcionaría mejor que un enfoque dinámico basado en Reflection.Emit (que de todos modos no funciona en CF). La mayoría de las clases de CF funcionarán sin cambios en el marco completo, aunque no necesariamente, por supuesto.

+0

Una gran idea, sería una solución ideal si funciona :-) No estoy seguro de cómo implementarlo. ¿Podría explicar cómo incorporaría los métodos nuevamente a la clase? Además, ¿conoce algún proyecto que utilice esta técnica, que podría usar como ejemplo? – Hermit

+0

Después de reflexionar un poco sobre Reflection, me di cuenta de que no tendrías que hacer lo que sugerí en absoluto. Estaba proponiendo un generador de código que simplemente iteraría a través de todos los Campos y Propiedades (usando Type.GetFields y Type.GetProperties) y construiría Serialize y Deserialize personalizados que luego copiarías y pegarías en la clase original. Como resultado, no es necesario utilizar Reflection.Emit para esto, por lo que no hay ninguna razón por la que no pueda hacer esta iteración dinámicamente en los métodos personalizados Serialize y Deserialize en su clase CF. – MusiGenesis

+0

Incluso podría escribir una clase genérica con Serializar y Deserializar métodos estáticos que toman un Objeto como parámetro y devuelven el material serializado (para Serializar) o que toma la pieza serializada y devuelve un Objeto (para Deserializar). GetFields y GetProperties (junto con las clases FieldInfo y PropertyInfo) están disponibles en el marco personalizado.Incluso podría serializar en XML o en una matriz de bytes [] como quiera, pero dado que desea manejar futuros cambios en las clases, creo que XML sería el camino a seguir. – MusiGenesis

Cuestiones relacionadas