.net Compact框架中Reflection.Emit的替代方案

.net Compact框架中Reflection.Emit的替代方案,.net,reflection,compact-framework,reflection.emit,.net,Reflection,Compact Framework,Reflection.emit,NET CF似乎缺少非常有用的Reflection.Emit。 到目前为止,我发现这个库是另一个选择: 然而,它似乎是一个被抛弃的早期版本,所以我正在寻找更多的选择 有人知道另一种排放替代品吗? 或者可能有人使用了EmitCF并可以对其状态进行评论 顺便说一句,更大的图景:我正在尝试为CF生成Emit,这样我就可以在CF下工作,这样我就可以优化我正在使用的序列化代码()您需要的是Cecil(),一个用于生成和检查CIL格式的程序和库的Mono项目库。它是主动维护的,比Reflection.Emi

NET CF似乎缺少非常有用的Reflection.Emit。 到目前为止,我发现这个库是另一个选择:

然而,它似乎是一个被抛弃的早期版本,所以我正在寻找更多的选择

有人知道另一种排放替代品吗? 或者可能有人使用了EmitCF并可以对其状态进行评论


顺便说一句,更大的图景:我正在尝试为CF生成Emit,这样我就可以在CF下工作,这样我就可以优化我正在使用的序列化代码()

您需要的是Cecil(),一个用于生成和检查CIL格式的程序和库的Mono项目库。它是主动维护的,比Reflection.Emit做的更多,并且在很多项目中都使用了它,包括一些以.NET CF为目标的项目。

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


这将需要更多的工作(当然,这也是一个不断增加工作的来源),但它的性能会比基于Reflection.Emit的动态方法(无论如何在CF中都不起作用)更好。大多数CF类在整个框架中都不会发生变化,当然也不一定如此。

XML序列化是严格要求吗?如果不是,您可以使用类似prot-buf的东西来查看二进制序列化。是的,需要基于文本的序列化。我发现这是确保我可以轻松地将数据迁移到程序新版本的唯一实用方法。EmitCF基于Cecil。。。不过我会仔细看看塞西尔,这是个好主意。我能找到的Cecil的最新版本是2007年的0.6。有更新的版本吗?Cecil已经迁移到Mono core,因此最新版本与Mono类库一起发布。源代码位于,如果您下载Mono,Mono.Cecil.dll将被包括在内。好主意,如果它能工作,它将是一个理想的解决方案:-)我不知道如何实现它。您能详细说明一下如何将这些方法合并回类中吗?另外,你知道有任何使用这种技术的项目,我可以用它作为例子吗?在研究了一下反射之后,我意识到你根本不必按照我的建议去做。我提出了一个代码生成器,它只需迭代所有字段和属性(使用Type.GetFields和Type.GetProperties),并构造自定义序列化和反序列化方法,然后将这些方法复制并粘贴回原始类中。事实证明,您不需要使用反射。为此,发射,因此,您没有理由不能在CF类中的自定义序列化和反序列化方法中动态执行此迭代。您甚至可以使用以对象为参数的序列化和反序列化静态方法编写一个泛型类,并返回序列化的内容(用于序列化)或者获取序列化的片段并返回一个对象(用于反序列化)。GetFields和GetProperties(以及FieldInfo和PropertyInfo类)在自定义框架中可用。您甚至可以按照自己的喜好序列化为XML或byte[]数组,但由于您希望处理将来对类的更改,因此我认为XML将是一种可行的方法。如果我不清楚,请告诉我,今天早上,我将发布我为测试而编写的一些示例代码。这让我想到了在编译时使用PostSharp生成无反射序列化方法。我会试着看看我能不能把它用上。