近來剛好在看一些關於反射的東西,之前一直沒用過,真是慚愧,後來看了些資料後,覺得好像也不怎麼難,就一句話:
Assembly.Load(Assembly.GetExecutingAssembly().FullName).CreateInstance(Namespace + "." + ClassName);就搞掂了,
但是很多貌似簡單(或許真的是很簡單吧)的問題就搞了我很久,就是關於那個程式集的問題,一開始的時候,
只是知道Assembly.Load("程式集名")這個,只是知道用Assembly.GetExecutingAssembly().FullName這可以拿到了,
看似一切都是那麼的簡單,但是當我在調試時,卻發現我反射不出那個類,找了些資料才知道,原來是程式集出了問題了.
正確點來說,是我用錯了程式集,對於很多新人來說,或是剛接觸的反射的來說,可能並不怎麼瞭解那些程式集是怎麼一回事.
我做了測試後得出:
1.類
所有的類是在同一個程式集中,所有的類都在App_Code的檔案夾下(預設),在App_Code裡,不管你分幾個檔案夾存放那些類,不管
類中有多少個namespace,都只有一個程式集.
2.使用者控制項
每一個UserControl屬於不同的程式集,不管你是否放在同一個檔案夾裡.
3.頁面
每一個不同的頁面都屬於同一個程式集.不管程式碼的命名空間是否一致.在運行時,所有頁面的命令空間會預設顯示
為"ASP",而你加的命名空間,則和頁面的名字加起來統稱為基類名了.
關於反射Assembly.Load("程式集").CreateInstance("命名空間.類"),而不管在哪一層寫這段代碼其中的("程式集")
讀取的實際是web層bin檔案夾下的dll,也就是說你反射的類的程式集dll在web層的bin下必須有,當我們的程式運行或發布時,.Net工具會自動
的添加當前項目的類的dll,頁面的dll,還有使用者控制項的dll.
注意CreateInstance()一定是命名空間.類名,否則建立的執行個體為空白
Assembly.Load("程式集名")
Assembly.LoadFrom("程式集實際路徑")
希望我這些總結可以給那些剛入門的朋友一點協助,本人才疏學淺,要是有什麼不對的地方,還忘朋友倍們指出.
在此賦上我的測試代碼.Reflect程式集測試例子 ,大家下載後,用VS中開啟後,可以直接瀏覽default,和default2這兩個頁面,並做些對比,相信這時你會明白很多.