2009-09-05 8 views
8

Es scheint, dass .NET CF die sehr nützliche Reflection.Emit fehlt. Bisher habe ich diese Bibliothek als Alternative gefunden: http://www.codeplex.com/EmitCF.Alternativen zu Reflection.Emit für das Compact Framework

Allerdings scheint es eine verlassene frühe Version zu sein, also suche ich nach mehr Optionen.

Kennt jemand eine andere Alternative zu Emit? Oder hat jemand EmitCF benutzt und kann seinen Status kommentieren?

BTW, das größere Bild: Ich versuche Emit für die CF zu bekommen, so dass ich http://dynamic.codeplex.com bekommen kann unter der CF zu arbeiten, so kann ich die Serialisierung Code optimieren Ich verwende (http://www.codeproject.com/KB/XML/GR_CustomXmlSerializer.aspx)

+1

Ist die Serialisierung nach XML eine strenge Anforderung? Wenn nicht, könnten Sie die binäre Serialisierung mit etwas wie prot-buf betrachten. – ctacke

+0

Ja, eine textbasierte Serialisierung ist erforderlich. Ich habe festgestellt, dass dies der einzige praktische Weg ist, um sicherzustellen, dass ich meine Daten problemlos auf neue Versionen meiner Programme migrieren kann. – Hermit

Antwort

5

Was Sie brauchen, ist Cecil (http://mono-project.com/Cecil), eine Mono-Projektbibliothek zum Generieren und Inspizieren von Programmen und Bibliotheken im CIL-Format. Es ist aktiv gepflegt, tut viel mehr als Reflection.Emit und es wird in vielen Projekten verwendet, darunter auch einige, die auf .NET CF zielen.

+0

EmitCF basiert auf Cecil ... Ich werde Cecil genauer betrachten, aber es ist eine gute Idee. Die neueste Version von Cecil, die ich finden kann, ist 0.6, von 2007. Gibt es neuere? – Hermit

+0

Cecil wurde seither zum Mono-Core verschoben, daher werden die neuesten Versionen mit den Mono-Klassenbibliotheken vertrieben. Die Quelle ist http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/Mono.Cecil/, und wenn Sie Mono herunterladen, wird Mono.Cecil.dll enthalten sein. –

1

Dies ist nicht genau eine Antwort auf Ihre Frage, aber da Reflection.Emit in CF nicht unterstützt wird, könnte ein alternativer Ansatz zur Serialisierung/Deserialisierung darin bestehen, Ihre Klassen in eine normale Windows-Anwendung zu kompilieren Verwenden Sie Reflection.Emit, um programmatisch für jede Klasse Serialisierungs- und Deserialisierungsmethoden zu generieren, die dann in der CF-Version wieder in die Klasse integriert werden können. Grundsätzlich würden Sie Reflection.Emit im gesamten Framework für die Codegenerierung verwenden.

Dies wäre mehr Arbeit (und eine konstante Quelle für mehr Arbeit, natürlich), aber es würde besser funktionieren als ein dynamischer, Reflection.Emit-basierter Ansatz (der in CF sowieso nicht funktioniert). Die meisten CF-Klassen funktionieren unverändert im vollen Rahmen, natürlich nicht unbedingt.

+0

Großartige Idee, es würde eine ideale Lösung machen, wenn es funktioniert :-) Ich bin mir nicht sicher, wie ich es implementieren soll. Könnten Sie näher erläutern, wie Sie die Methoden in die Klasse integrieren würden? Kennen Sie auch Projekte mit dieser Technik, die ich als Beispiel verwenden könnte? – Hermit

+0

Nachdem ich ein wenig in Reflection geblickt hatte, wurde mir klar, dass Sie das, was ich vorgeschlagen hatte, nicht tun müssten. Ich schlug einen Code-Generator vor, der nur durch alle Felder und Eigenschaften (mit Type.GetFields und Type.GetProperties) iterieren und benutzerdefinierte Serialize- und Deserialize-Methoden erstellen würde, die Sie dann kopieren und in die ursprüngliche Klasse einfügen würden. Es stellt sich heraus, dass Sie Reflection.Emit nicht für diesen Zweck verwenden müssen. Es gibt also keinen Grund, warum Sie diese Iteration nicht einfach in benutzerdefinierten Serialize- und Deserialize-Methoden in Ihrer CF-Klasse durchführen könnten. – MusiGenesis

+0

Sie könnten auch einfach eine generische Klasse mit statischen Methoden Serialize und Deserialize schreiben, die ein Objekt als Parameter nehmen und das serialisierte Zeug (für Serialize) zurückgeben oder das serialisierte Stück nehmen und ein Objekt (für Deserialize) zurückgeben. GetFields und GetProperties (zusammen mit den Klassen FieldInfo und PropertyInfo) sind im benutzerdefinierten Framework verfügbar.Sie könnten sogar nach XML oder zu einem Array byte [] serialisieren, wie Sie möchten, aber da Sie zukünftige Änderungen an den Klassen handhaben wollen, denke ich, XML wäre der Weg zu gehen. – MusiGenesis