.Net 程序编译相关深度问题。。。
我想问下 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 内的 字段 属性 方法 等的顺序的。。
--------------------编程问答-------------------- 固定为什么好操作?只有值类型,才支持内存直接拷贝。
需要加上[StructLayout(LayoutKind.Sequential)],这样就保证成员按照定义的顺序排列了。 --------------------编程问答--------------------
比如 自定义序列化 需要绑定名称与值的关系。。。
#绑定
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));
}
就直接绑定所有的字段呢,,,不用一个个的写。 --------------------编程问答-------------------- 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));
}
就可以了。而且不用管顺序了。 --------------------编程问答--------------------
类和字段用的都是 internal 定义。。
这个 就是为了在程序被混淆后,,,字段名称改变的情况下,,能够序列化。。
这样不行哈,,混淆后字段名称就变了,,就不能序列化取值呢。。
--------------------编程问答-------------------- 混淆后。。。就不能用 f.Name 取值呢。。。 因为 f.Name 是随机的。 --------------------编程问答-------------------- 试试http://fastcsharp.codeplex.com,生成序列化代码,混淆应该没问题。
补充:.NET技术 , C#