2009-09-05 23 views
8

Sembra che su .NET CF manchi l'utilissimo Reflection.Emit. Finora ho trovato questa libreria come alternativa: http://www.codeplex.com/EmitCF.Alternative a Reflection.Emit per Compact Framework

Tuttavia sembra essere una versione iniziale abbandonata, quindi sto cercando altre opzioni.

Qualcuno sa di un'altra alternativa a Emit? O forse qualcuno ha usato EmitCF e può commentare il suo stato?

BTW, il quadro più ampio: Sto cercando di ottenere Emit per la CF, in modo che posso ottenere http://dynamic.codeplex.com a lavorare sotto la CF, in modo da poter ottimizzare il codice di serializzazione che sto usando (http://www.codeproject.com/KB/XML/GR_CustomXmlSerializer.aspx)

+1

La serializzazione in XML è un requisito rigoroso? In caso contrario, si potrebbe guardare la serializzazione binaria con qualcosa come prot-buf. – ctacke

+0

Sì, è richiesta la serializzazione basata su testo. Ho scoperto che è l'unico modo pratico per assicurarmi di poter facilmente migrare i miei dati a nuove versioni dei miei programmi. – Hermit

risposta

5

Quello che ti serve è Cecil (http://mono-project.com/Cecil), una libreria di progetti Mono per generare e controllare programmi e librerie in formato CIL. È mantenuto attivamente, fa molto più di Reflection.Emit ed è utilizzato in molti progetti, compresi quelli che hanno come destinazione .NET CF.

+0

EmitCF è basato su Cecil ... Darei un'occhiata più da vicino a Cecil, però, è una buona idea. La versione più recente di Cecil che riesco a trovare è 0.6, dal 2007. Ce ne sono di più recenti? – Hermit

+0

Da allora Cecil è stato spostato nel core Mono, quindi le ultime versioni sono distribuite con le librerie di classi Mono. La fonte è http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/Mono.Cecil/ e se si scarica Mono, Mono.Cecil.dll sarà incluso. –

1

Questa non è esattamente una risposta alla tua domanda, ma poiché Reflection.Emit non è supportato in CF, un approccio alternativo che potresti adottare per la serializzazione/deserializzazione sarebbe quello di compilare le tue classi in una normale applicazione Windows, e fare uso di Reflection.Emit per generare in modo programmato i metodi serialize e de-serialize per ogni classe, che potrebbero quindi essere incorporati nella classe nella versione CF. Fondamentalmente, dovresti usare Reflection.Emit nel framework completo per la generazione del codice.

Questo sarebbe più lavoro (e una fonte costante di più lavoro, ovviamente), ma funzionerebbe meglio di un approccio dinamico, basato su Reflection.Emit (che comunque non funziona in CF). La maggior parte delle classi CF funzionerà invariata nel quadro completo, anche se non necessariamente, ovviamente.

+0

Ottima idea, sarebbe una soluzione ideale se funzionasse :-) Non sono sicuro di come implementarlo. Potresti approfondire come incorporare i metodi nella classe? Inoltre, conosci qualche progetto che usa questa tecnica, che potrei usare come esempio? – Hermit

+0

Dopo aver esaminato un po 'il Reflection, mi sono reso conto che non avresti dovuto fare ciò che avevo suggerito. Stavo proponendo un generatore di codice che avrebbe semplicemente iterato attraverso tutti i campi e le proprietà (usando Type.GetFields e Type.GetProperties) e costruito metodi Serialize e Deserialize personalizzati che dovresti quindi copiare e incollare di nuovo nella classe originale. A quanto pare, non è necessario utilizzare Reflection.Emit per questo, quindi non c'è ragione per cui non si possa fare questa iterazione dinamicamente nei metodi personalizzati Serialize e Deserialize nella propria classe CF. – MusiGenesis

+0

Si potrebbe anche solo scrivere una classe generica con i metodi statici Serialize e Deserialize che accettano un oggetto come parametro e restituiscono il materiale serializzato (per Serialize) o che prende il pezzo serializzato e restituisce un oggetto (per deserializzare). GetFields e GetProperties (insieme alle classi FieldInfo e PropertyInfo) sono disponibili nel framework personalizzato.Potresti persino serializzare in XML o in un array di byte [] come preferisci, ma dal momento che vuoi gestire le future modifiche alle classi penso che XML sia la strada da percorrere. – MusiGenesis

Problemi correlati