程式集載入與反射筆記

2022-01-20 16:38:18 字數 3477 閱讀 4677

assembly

.load

//引導程式集,會從gac、應用程式基目錄、私有路徑子目錄查詢

assembly

.loadfrom

//從路徑載入,首先會得到程式集,然後內部呼叫assembly.load

assembly

.loadfile

assembly

.reflectiononlyloadfrom

//如果只想分析程式集的元資料,而不執行任何**,那麼這個方法再適合不過 了

/*獲取程式集中定義的型別*/

assembly.getexportedtypes

//獲取有所公開匯出的型別(程式集外部可見的型別,即是public型別)

//返回值是system.type陣列

type

.gettype

//接受乙個string引數,首先會檢查呼叫程式集,看它是否定義了指定名稱的型別。如果找到就去mscorlib.dll查詢

type

.reflectiononlygettype

//(僅反射)/type.getnestedtype/type.getnestedtypes

type.isclass/ispublic/isassignablefrom(...)

/*構造型別的例項*/

activator

.createinstance

activator

.createinstancefrom

//通過字串來指定型別及程式集,會呼叫assembly.loadfrom引導程式集

//返回值是objecthandle物件引用,需要呼叫objecthandle的unwrap方法進行具體化

.createinstance/createinstanceandunwrap

//和activator類方法類似,帶unwrap字尾方法幫我們簡化操作

.createinstancefrom/createinstancefromandunwrap

type.invokemember

//該方法查詢與傳遞的實參相匹配的乙個構造器,並構造型別

system.relection.constructorinfo例項方法invoke

var 

type =

type

.gettype(

);

/*①建立例項*/

var

instance = (

reflecttest

)null

; instance =

activator

.createinstance(type)

as reflecttest

; instance =

activator

.createinstancefrom(

, ).unwrap()

as reflecttest

; instance =

.currentdomain.createinstanceandunwrap(

, )

as reflecttest

; instance = type.invokemember(

null

, bindingflags

.createinstance,

null

, null

, null

) as

reflecttest

; instance = type.getconstructor(

type

.emptytypes).invoke(

null

) as

reflecttest

;

/*②呼叫成員*/

var

result = (

object

)null

;

//直接訪問

instance.print(

"hello world"

);

//type例項的invokemember方法【呼叫方法】

type.invokemember(

"print"

, bindingflags

.invokemethod,

type

.defaultbinder, instance,

new object

); 或者

type.getmethod(

"print"

).invoke(instance,

new object

);

//type例項的getmember方法【呼叫屬性】

result = type.getproperty(

"somemsg"

).getvalue(instance);

或者result = type.getproperty(

"somemsg"

).getgetmethod().invoke(instance,

null

); 或者

result = (type.getmember(

"somemsg"

, membertypes

.property,

bindingflags

.public |

bindingflags

.instance)[0]

as propertyinfo

).getvalue(instance);

console

.writeline(result);

//type例項的getfield方法【呼叫私有字段】

result = type.getfield(

"somemsg"

, bindingflags

.nonpublic |

bindingflags

.instance).getvalue(instance);

console

.writeline(result);

/*反射獲取attribute值*/

var

prop = type.getproperty(

"somemsg"

);

var

desctype =

typeof

(descriptionattribute

);

if (

attribute

.isdefined(prop, desctype))

程式集載入和反射

元資料表是用一系列字段表,方法表,型別定義表組成的。可以利用system.reflection命名空間中包含的型別,可以寫 來反射這些元資料表。具體的反射機制我是這樣理解的 首先應該清楚的了解到,system.reflection命名空間中的型別為程式集或模組中包含的換資料表提供了乙個物件模型 通過...

程式集載入和反射

最近一直都在看關於程式集載入和反射方面的資料,所以在這裡把我所學習到的東西記錄下來,方便自己以後複習,也給園子裡面不懂的朋友參考。net中反射在執行中過程中解析程式集中的元資料,獲得型別中的成員 包括字段 構造器 方法 屬性 事件等 資訊。把下面的類放在乙個類庫工程中,並編譯生成程式集 例如為cla...

程式集載入與反射(一) 理論篇

目錄 一 程式集載入 load方法 clr通過呼叫system.rreflection.assemblly類的靜態方法來顯示引導程式集。public static assembly load assemblyname assemblyref public static assembly load s...