1. 反射簡介
2. 使用反射
3. 反射調(diào)用方法的執(zhí)行機(jī)制
1. 反射簡介
程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對(duì)象。您可以使用反射動(dòng)態(tài)地創(chuàng)建類型的實(shí)例,將類型綁定到現(xiàn)有對(duì)象,或從現(xiàn)有對(duì)象中獲取類型。然后,可以調(diào)用類型的方法或訪問其字段和屬性。(FROM MSDN)
2. 使用反射
2.1 反射對(duì)象模型(FROM 《Essential.Net》)
2.2 反射類型的層次結(jié)構(gòu)(FROM 《Essential.Net》)
2.3 各個(gè)對(duì)象的創(chuàng)建方式和功能
| 對(duì)象 | 創(chuàng)建該對(duì)象 | 功能(FROM MSDN) |
| Assembly | Assembly.Load Assembly.LoadFile Assembly.LoadFrom | 使用 |
| Assembly.GetModule Assembly.GetModules | 使用 | |
| Type.GetConstructor Type.GetConstructors Type.GetConstructorImpl | 使用 | |
| Type.GetMethod Type.GetMethods Type.GetMethodImpl | 使用 | |
| Type.GetField Type.GetFields | 使用 | |
| Type.GetEvent Type.GetEvents | 使用 | |
| Type.GetProperty Type.GetProperties Type.GetPropertyImpl | 使用 | |
| MethodBase.GetParameters | 使用 | |
| 當(dāng)您在一個(gè)應(yīng)用程序域的僅反射上下文中工作時(shí),請(qǐng)使用 |
2.4 反射調(diào)用實(shí)例
namespace NameSpace{internal class Reflect
{private int Add(int arg0, int arg1, int arg2)
{ return arg0 + arg1 + arg2;}
}
class Program {internal static int CallAdd()
{ //指定TypeName創(chuàng)建對(duì)象實(shí)例object target = Assembly.GetExecutingAssembly().CreateInstance("NameSpace.Reflect", true);
//取得方法Type type = target.GetType();
MethodInfo methodInfo = type.GetMethod("Add", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);if (methodInfo == null)
return 0;object[] args = new object[] { 10, 20, 30 };
object result = methodInfo.Invoke(target, args); //調(diào)用
return Convert.ToInt32(result);}
}
}
3. 反射調(diào)用方法的執(zhí)行機(jī)制
MethodInfo.Invoke使用提供的對(duì)象引用和參數(shù)來調(diào)用底層方法。其執(zhí)行過程如下(FROM 《Essential.Net》):
(1). 構(gòu)建一個(gè)堆棧幀;
(2). 將參數(shù)值拷貝到堆棧上;
(3). 調(diào)用目標(biāo)方法(IA-32處理器的call指令);
(4). 方法執(zhí)行完畢后,Invoke識(shí)別按引用傳遞的參數(shù),并將他們拷貝回參數(shù)值數(shù)組中;
(5). 如果方法有返回值,則將該值作為Invoke的返回值。
下圖展示了上面2.4中示例代碼的執(zhí)行過程:
補(bǔ)充:
1. 有關(guān)堆棧幀,可以參考:《Reversing:逆向工程揭密》 堆棧幀
2. 上圖中,展示的是fastcall調(diào)用約定,fastcall調(diào)用約定通常使用ECX寄存器和EDX寄存器來分別存放第一個(gè)參數(shù)和第二個(gè)參數(shù)。有關(guān)調(diào)用約定,可以參考:《Reversing:逆向工程揭密》 調(diào)用約定
浙公網(wǎng)安備 33010602011771號(hào)