我想问下 C# 程序编译后,class 内的 MemberInfo 顺序都是固定的吗 ?我用下面这段程序  生成后  在 XP   WIN7x64  2个电脑上运行,字段顺序都是一样的。我分别用了2个混淆器,混淆后,在2个电脑上运行 生成的 字段顺序也是一样的。。
我想问下,,.Net 程序编译后 class 内的 MemberInfo 顺序和什么有关,,是否顺序是固定的 ?
    internal class test
    {
        internal string VerSion;
        internal string str1;
        internal string str2;
        internal string str3;
        internal string str4;
        internal string str5;
        internal int var1;
        internal int var2;
        internal int var3;
        internal int var4;
        internal int var5;        internal void test_程序内当前字段顺序()
        {
            foreach (var f in this.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic))
            {
                Console.WriteLine("Name:{0}, Type:{1}", f.Name.PadRight(20, ' '), f.MemberType);
            }
        }
    }
输出:
Name:VerSion             , Type:Field
Name:str1                , Type:Field
Name:str2                , Type:Field
Name:str3                , Type:Field
Name:str4                , Type:Field
Name:str5                , Type:Field
Name:var1                , Type:Field
Name:var2                , Type:Field
Name:var3                , Type:Field
Name:var4                , Type:Field
Name:var5                , Type:Field

解决方案 »

  1.   


    有时候做自定义序列化,或者反射。。都是需要知道 字段或者方法名称的。。一个个写 string 的名称太麻烦,,也不好维护。。如果字段 或者方法的顺序是固定的话,,就好操作多了
    不知道IL程序编译后,,是如何确定   CLASS 内的 字段 属性  方法  等的顺序的。。
      

  2.   

    固定为什么好操作?只有值类型,才支持内存直接拷贝。需要加上[StructLayout(LayoutKind.Sequential)],这样就保证成员按照定义的顺序排列了。
      

  3.   


    比如 自定义序列化  需要绑定名称与值的关系#绑定
    info.AddValue("new_name1", this.var1, type(string));
    info.AddValue("new_name2", this.var2, type(string));
    info.AddValue("new_name3", this.var3, type(string));#取值
    this.var1 = info.GetValue("new_name1", type(string))
    this.var2 = info.GetValue("new_name2", type(string))
    this.var3 = info.GetValue("new_name3", type(string))这样一个个添加,,字段,属性比较多的时候,太麻烦,,,不方便维护。。字段顺序不变的话。。我用foreach (var f in this.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic))
                {
                    f.SetValue(this, info.GetValue("f_"+(i++), f.FieldType));
                }就直接绑定所有的字段呢,,,不用一个个的写。
      

  4.   

    foreach (var f in this.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic))
    {
        if (f.Name.StartsWith("f_"))
            f.SetValue(this, info.GetValue(f.Name, f.FieldType));
    }
    就可以了。而且不用管顺序了。
      

  5.   


    类和字段用的都是  internal 定义。。 这个 就是为了在程序被混淆后,,,字段名称改变的情况下,,能够序列化。。这样不行哈,,混淆后字段名称就变了,,就不能序列化取值呢。。
      

  6.   

    混淆后就不能用   f.Name 取值呢  因为   f.Name 是随机的。
      

  7.   

    试试http://fastcsharp.codeplex.com,生成序列化代码,混淆应该没问题。