1. 程式人生 > >c# 反射機制的基本瞭解

c# 反射機制的基本瞭解


        1.反射機制的簡單介紹
        
            反射機制,有一個應用方面就是用來做外掛,這麼外掛具體以後會做成什麼樣,我們不清楚,但反射機制使我們可以執行使用這個外掛。
            
            也就是說,反射機制使我們可以使用一些未知的型別,未知的函式方法等
            
        
        2.使用之前先大概瞭解下應用程式的結構
        
            基本是範圍最大到最小
            
            AppDomain:應用程式域,應用程式在其中執行的獨立執行環境(最大)
            
            Assembly:程式集    (包含一個或多個Module)
            
            Module:模組
            
            Type:型別
            
        3.具體怎麼用
                dll程式碼
                /*
                    using System;
                    namespace ExternDll
                    {
                        class Program
                        {
                            static void Main()
                            {
                                Console.WriteLine("ExternDll執行中");
                            }
                        }
                    }
                */
                (1)引入需要程式集(exe、dll檔案): 
                        

                        Assembly ExternDll = Assembly.Load("ExternDll");
                
                (2)得到模組(單模組的程式集可忽略):
                
                        Module module=ExternDll.ManifestModule;
            
                (3)得到所要的型別:
                
                        Type DllType= module.GetType("ExternDll.Program"); 
                        // Type DllType = ExternDll.GetType("ExternDll.Program");
                
                (4)如果要使用某個型別中的方法,先建立型別例項,在得到方法


                         MethodInfo methodInfo=DllType.GetMethod("Main",BindingFlags.Static                                                                                        |BindingFlags.Public|BindingFlags.NonPublic);
                        object o = Activator.CreateInstance(DllType);
                        methodInfo.Invoke(o, new object[] { });


            注意的問題:
            
                (1)Assembly載入方法的使用
                
                    Assembly.Load()
                    
                    Assembly.LoadFrom()
                    
                    Assembly.LoadFromFile()
                
                    Assembly.ReflectionOnlyLoadFrom(String assemblyFile)

                    Assembly.ReflectionOnlyLoad(byte[] rawAssembly)

                    Assembly.ReflectionOnlyLoad(String assemblyName)
                
                
               (2)BindingFlags的使用(從程式集篩選所需要的型別Type)
            
                    NonPublic:非Public修飾的    (需要與Static或Instance組合使用)
                    Public:Public修飾的            (需要與Static或Instance組合使用)
                    Static:靜態的
                    Instance:例項的
                    
                    DeclaredOnly:指定只獲取自己定義的
                    GetField
                    SetField
                    BindingFlags.CreateInstance
                    
               (3) Activator.CreateInstance用法(可以用這個方法建立型別例項)
                
                
               (4)Appdomain的使用
                
                    Appdomain類似輕量級程序,是 .net / mono 程式碼執行時的一個邏輯容器
                    
                    一般情況下不需要關注Appdomain,除非以下的情況:
                    
                    (1)動態解除安裝程式集(執行時載入程式集是不支援Unload的)
                    
                    (2)實現程式隔離
                    
                    (3)限制程式碼安全
                    
                    (4)載入相同程式的不同版本
                    
                    (5)有效利用資源
                    
                    (6)減少記憶體佔用


              (5)早繫結與晚繫結

                      早繫結:編譯器或直譯器能知道程式碼中所指定的具體型別,能給出提示

                      晚繫結:程式執行才知道具體型別


              學習連線:c#反射機制學習和利用反射獲取型別資訊