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#反射机制学习和利用反射获取类型信息
            

                    
                    

猜你喜欢

转载自blog.csdn.net/qq_38806355/article/details/82846247