我想问下 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
有时候做自定义序列化,或者反射。。都是需要知道 字段或者方法名称的。。一个个写 string 的名称太麻烦,,也不好维护。。如果字段 或者方法的顺序是固定的话,,就好操作多了
不知道IL程序编译后,,是如何确定 CLASS 内的 字段 属性 方法 等的顺序的。。
比如 自定义序列化 需要绑定名称与值的关系#绑定
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));
}就直接绑定所有的字段呢,,,不用一个个的写。
{
if (f.Name.StartsWith("f_"))
f.SetValue(this, info.GetValue(f.Name, f.FieldType));
}
就可以了。而且不用管顺序了。
类和字段用的都是 internal 定义。。 这个 就是为了在程序被混淆后,,,字段名称改变的情况下,,能够序列化。。这样不行哈,,混淆后字段名称就变了,,就不能序列化取值呢。。