C# DLL 확인 -- 반사

4330 단어 .Netc#리플렉스DLL
얼마 전에 코드를 두드리면 동적 불러오는 외부 DLL이 필요하고 DLL을 분석하여 DLL의 클래스, 속성을 읽을 수 있으며, 때로는 특성의 값을 읽을 수도 있습니다.이 문제는 처음에 만났는데 조금의 생각도 없었다. 이전에는 이렇게 써 본 적이 없었는데, 나중에 자료를 찾아 다른 사람에게 가르침을 청하니 마침내 결과가 나왔다.코드가 생긴 후에 문제를 찾는 과정에서 나는 헷갈렸다. 왜냐하면 이 문제를 해결하는 방식은 주로 반사이기 때문이다.반사를 사용하여 DLL을 동적으로 로드하고 호출합니다.다음은 나의 실현을 살펴보자.
내가 한 예는 DLL을 읽는 경로를 통해 DLL을 불러온 다음에 DLL의 클래스 이름을 읽고, 모든 클래스의 속성, 클래스와 속성의 특성을 훑어보는 것이다.
주요 코드는 다음과 같습니다.
1. 프로그램 집합을 불러오기:
        A ssembly ass=Assembly.LoadFrom(DllPath);         Assembly.LoadFile은 지정된 파일만 로드하고 종속 프로그램 세트는 자동으로 로드되지 않습니다.Assmbly.Load는 나중에 이름을 끊을 필요가 없습니다. 2. 유형의 이름 공간과 이름을 이용하여 클래스의 유형 Type type=ass.GetType("Type Name")을 얻을 수 있습니다.3. 지정된 매개변수 인스턴스 유형 Object bj = Activator를 사용합니다.CreateInstance(type,params[]); 4, 방법 명칭을 통해 획득 방법 MethodInfo mi=type.GetMethod(“MehtodName”);
5. 매개 변수의 직선 방법에 따라 반환값은 원래 방법의 반환값이다
        mi.Invoke(obj,params[]); 6、로드 클래스의 속성
       PropertyInfo p = this.GetType().GetProperty("xxx");
예는 다음과 같습니다.
        /// 
        ///       DLL
        /// 
        /// 
        public ActionResult LoadEntityDll(string path)
        {
           //      DLL
            LoadDLL dld = new LoadDLL(path);
            ass = new LoadDLL(path).GetAssembly();
            //DynamicLoadDLL.LoadDLL dld = new DynamicLoadDLL.LoadDLL(path);
            //  DLL        
            foreach (var types in dld.GetTypes())
            {                
                //      ---  
                if (types.GetCustomAttributes(typeof(ClassesAttribute),false)!=null )
                {
                    string name = types.Name;                 
                    ClassesAttribute className = (ClassesAttribute)types.GetCustomAttributes(typeof(ClassesAttribute), true).FirstOrDefault();                    //  ___   
                    A a=new A();
                    a.EntityName = name;                    
                    if (className!= null)
                    {
                        a.EntityDesc = className.TableName;                       
                    }
                    else
                    {
                        a.EntityDesc = name;
                    }
                    //                   
                    string strnamespace = types.Namespace;
                    DynamicLoadProperty(strnamespace, name, a);                    
                }
            }

            return View("xx");
        }

        /// 
        ///       --   
        /// 
        public void DynamicLoadProperty(string strnamespace, string classname, A a)
        {
            aWCF = UIServiceFactory.GetQueryPropertiesService();           
            LoadClass dlc = LoadClass.GetInstance(ass, strnamespace, classname);  
            #region       --      
            foreach (var attrs in dlc.GetAttrs())
            {
                //        
                a.ControlHtmlId = attrs.Name;                
                //    
                //DisplayAttribute temDesc = (DisplayAttribute)attrs.GetCustomAttributes(typeof(DisplayAttribute), true).FirstOrDefault();
                ColumAttribute temDesc = (ColumAttribute)attrs.GetCustomAttributes(typeof(ColumAttribute), true).FirstOrDefault();

                if (temDesc != null)
                {
                    a.PropertyDesc = temDesc.ColumName;
                }
                else
                {
                    a.PropertyDesc = attrs.Name;
                }             

            }
            #endregion
        }
        #endregion

요약: 위의 두 가지 방법 중 하나는 DLL을 로드하는 클래스이고 하나는 읽기 클래스의 속성입니다. 사실 여러분이 자세히 살펴보면 알 수 있습니다.이 코드의 눈과 한마디가 반사라고 생각합니다.
ass = new LoadDLL(path).GetAssembly();

나머지 로드 클래스, 로드 방법, 로드 속성, 로드 특성은 모두 겸사겸사 하는 일입니다.그런데 시작할 때 생각지도 못했어?왜?
사후에 반성하면 첫째, 코드 경험이 부족하다는 것이고, 둘째, 이 문제를 조용히 생각하지 않았다는 것이다.예전에는 디자인 모델을 공부할 때 접촉반사를 했는데, 지금은 반사의 원리를 이해하지 못한 것 같다.반사본은 문자열을 통해 클래스를 찾을 수 있는 '클래스를 읽는 방식' 이다.이번에는 반사에 대한 누락과 결원을 보충하는 셈이다.마지막으로 반사라는 개념을 여러분께 공유합니다.http://www.csharpwin.com/csharpspace/8982r7645.shtml.

좋은 웹페이지 즐겨찾기