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