在開發中,經常會遇到這種情況,在程序集A.dll中需要反射程序集B.dll中的類型。如果使用稍有不慎,就會產生運行時錯誤。例如使用Type.GetType("BNameSpace.ClassName")在程序集A.dll獲取程序集B.dll中的類型,就會返回Null。
關於跨程序集的反射,有兩點需要注意:
1、如果使用typeof,編譯能通過,則跨程序集的反射一定可以正常運行。可以說,typeof是支持強類型的。比如
1 Type supType = typeof(BNameSpace.SubSpace.Class);如果當前程序集沒有添加對EnterpriseServerBase.dll的引用,則編譯會報錯。
2、如果使用Type.GetType來進行反射的話,情況就復雜些。這是因為Type.GetType是非強類型的。Type.GetType的參數是一個string為類型的完全限定名,如果當string表示的目標類型不在當前程序集中,則運行時Type.GetType會返回null。解決的辦法是:首先加載目標程序集,然後再使用Assembly.GetType方法來獲取類型。如
1 Assembly asmb = Assembly.LoadFrom("EnterpriseServerBase.dll") ;
注意,當使用Type.GetType的時候,即使你添加了對EnterpriseServerBase.dll的引用,Type.GetType("EnterpriseServerBase.DataAccess.IDBAccesser")也會返回null,這是因為Type.GetType只會在當前程序集中進行類型搜索!