紧凑框架下的Reflection.Emit替代方案

8
看起来 .NET CF 缺少非常有用的 Reflection.Emit。
到目前为止,我发现这个库可以作为替代品:http://www.codeplex.com/EmitCF
然而它似乎是一版早期版本,所以我正在寻找更多选择。
是否有人知道 Emit 的另一个替代品? 或者,也许有人使用过 EmitCF 并能对其状态发表评论?
顺便说一下,更大的图景是:我正在尝试为 CF 获取 Emit,以便在 CF 下使用http://dynamic.codeplex.com,以此优化我正在使用的序列化代码(http://www.codeproject.com/KB/XML/GR_CustomXmlSerializer.aspx)。

1
序列化到XML是严格要求吗?如果不是,您可以考虑使用类似于Protobuf的二进制序列化。 - ctacke
是的,需要基于文本的序列化。我发现这是确保我可以轻松地将我的数据迁移到程序的新版本的唯一实用方式。 - Hermit
2个回答

5
你需要的是Cecil(http://mono-project.com/Cecil)这个Mono项目库,它可以生成和检查CIL格式的程序和库。它正在积极维护,并且比Reflection.Emit功能更强大,被许多项目使用,包括一些针对.NET CF的项目。

EmitCF基于Cecil实现...不过我会仔细研究一下Cecil,这是个好主意。我能找到的最新版本的Cecil是0.6,发布于2007年。是否有更新的版本呢? - Hermit
Cecil已经被移动到Mono核心,因此最新版本与Mono类库一起分发。源代码位于http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/Mono.Cecil/,如果您下载了Mono,Mono.Cecil.dll将被包含在内。 - Andreia Gaita

1

这并不是对你问题的确切回答,但由于CF不支持Reflection.Emit,您可以采取另一种序列化/反序列化的方法,将您的类编译成常规Windows应用程序,并利用Reflection.Emit为每个类编程生成序列化和反序列化方法,然后将其合并到CF版本的类中。基本上,您将在完整框架中使用Reflection.Emit进行代码生成。

这将需要更多的工作(当然也是不断的工作),但它比动态的、基于Reflection.Emit的方法执行得更好(无论如何,在CF中都不起作用)。大多数CF类在完整框架中都可以不改变地使用,尽管当然不是所有情况。


好主意,如果它能够实现的话,那将是一个理想的解决方案 :-)但我不确定如何去实现它。你能详细说明一下如何将这些方法重新整合到类中吗?此外,你知道有哪些使用这种技术的项目吗?我可以用作参考的例子吗? - Hermit
你甚至可以编写一个通用类,其中包含Serialize和Deserialize静态方法,这些方法以Object作为参数并返回序列化的内容(对于Serialize),或者以序列化的内容作为参数并返回Object(对于Deserialize)。在自定义框架中,GetFields和GetProperties(以及FieldInfo和PropertyInfo类)都是可用的。你甚至可以根据需要将其序列化为XML或byte[]数组,但由于你想处理类的未来更改,我认为XML是最好的选择。 - MusiGenesis
我不确定我是否正确理解了你的意思。你是在建议编写一个使用反射来创建序列化方法的代码生成器吗?如果您能发布您的示例代码,那将会很棒。 - Hermit
1
这给了我一个想法,使用PostSharp在编译时生成无需反射的序列化方法。我会尝试看看能否让它工作。 - Hermit
@Roy:我的最初建议是编写一个使用反射创建序列化方法的代码生成器。然而,当我进一步研究时,我意识到我考虑使用的反射方法(GetFields、GetProperties)都存在于紧凑框架中,因此您甚至不需要进行代码生成-您可以使用迭代运行时方法对类进行序列化和反序列化。然后我意识到您可以使用内置的.Net序列化来完成同样的事情。然后我关闭了浏览器,去喝了一杯啤酒。 - MusiGenesis
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接