2016-01-15 58 views
0

我最近開始閱讀一個開源加密程序是如何工作的。如何調用.getmethodinfo?

問題是,我被困在這兩行代碼中,我根本無法理解,我已經看過MSDN,但它根本無法理解這兩行代碼。

MethodInfo run = Assembly.Load(InjRes).GetType("Resource.reflect").GetMethod("Run"); 
bool inj = (bool)run.Invoke(null, new object[] { Assembly.GetExecutingAssembly().Location, "", PayloadRes, false }); 

我也試圖找出另一種方式來完成同樣的事情,有沒有辦法來調用.GetMethod?

+6

您需要閱讀[Reflection](https://msdn.microsoft.com/en-us/library/ms173183.aspx)上的教程。 – sstan

回答

0

這是.NET中相當基本的「反射」。

基本上這裏所發生的是:

  • 加載由InjRes
  • 內部的裝配指示的.NET程序集,得到Resource.reflect類型定義(這可能是一個class
  • 裏面的Resource.reflect型,獲得Run方法並將其保存到變量run
  • 調用(在其他作品中,「執行」)的Run()null實例函數(這意味着Run()可能是一個static方法)與參數(Assembly.GetExecutingAssembly().Location, "", PayloadRes, false)

更簡單地說,這些線路將轉化爲「普通的舊C#」,看起來像:

bool inj = Resource.reflect.Run(Assembly.GetExecutingAssembly().Location, "", PayloadRes, false); 

但原作者,也可能無法剛纔寫了簡單的1線之上,因爲無論:

  • 該組件沒有在編譯時引用的,所以編譯器不知道的Resouce命名空間,這樣會拋出一個編譯錯誤
  • Resouce.reflect類或Run方法不是public所以已經不能正常調用。反思可以繞過這個限制。
+0

非常感謝你的解釋,非常感謝! – user5796703