AppDomain.CurrentDomain.GetAssemblies();获取程序集,但是获取的只是已经加载的dll,引用的获取不到。

System.Reflection.Assembly.GetEntryAssembly().GetReferencedAssemblies(); 获取程序集,包括已经加载的和引用的未加载的dll,

但是获取的不是Assembly对象集,而是AssemblyName对象集。,这一点要清楚。。好的话不多说,开始正题哦。

C#反射获取程序集信息和通过类名创建类实例 。

System.Reflection 命名空间:包含通过检查托管代码中程序集、模块、成员、参数和其他实体的元数据来检索其相关信息的类型。

Assembly 类:表示一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。

注意下面说到的完全限定名是是指 类的完全限定名(命名空间 + 类名)

1、反射获取程序集信息

1.1 创建AssemblyResult.cs类,用于保存结果

  1. /// <summary>
  2. /// 反射结果类
  3. /// </summary>
  4. public class AssemblyResult
  5. {
  6. /// <summary>
  7. /// 程序集名称
  8. /// </summary>
  9. public List<string> AssemblyName { get; set; }
  10. /// <summary>
  11. /// 类名
  12. /// </summary>
  13. public List<string> ClassName { get; set; }
  14. /// <summary>
  15. /// 类的属性
  16. /// </summary>
  17. public List<string> Properties { get; set; }
  18. /// <summary>
  19. /// 类的方法
  20. /// </summary>
  21. public List<string> Methods { get; set; }
  22. }

1.2 创建AssemblyHandler.cs反射处理类

注意:要引用System.Reflection 命名空间。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Reflection;
  6. using System.IO;
  7. namespace MyStudyFrom
  8. {
  9. /// <summary>
  10. /// 反射处理类
  11. /// </summary>
  12. public class AssemblyHandler
  13. {
  14. string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"/he.dll/";
  15. /// <summary>
  16. /// 获取程序集名称列表
  17. /// </summary>
  18. public AssemblyResult GetAssemblyName()
  19. {
  20. AssemblyResult result = new AssemblyResult();
  21. string[] dicFileName = Directory.GetFileSystemEntries(path);
  22. if(dicFileName!=null)
  23. {
  24. List<string> assemblyList = new List<string>();
  25. foreach(string name in dicFileName)
  26. {
  27. assemblyList.Add(name.Substring(name.LastIndexOf('/') + 1));
  28. }
  29. result.AssemblyName = assemblyList;
  30. }
  31. return result;
  32. }
  33. /// <summary>
  34. /// 获取程序集中的类名称
  35. /// </summary>
  36. /// <param name="assemblyName">程序集</param>
  37. public AssemblyResult GetClassName(string assemblyName)
  38. {
  39. AssemblyResult result = new AssemblyResult();
  40. if (!String.IsNullOrEmpty(assemblyName))
  41. {
  42. assemblyName = path + assemblyName;
  43. Assembly assembly = Assembly.LoadFrom(assemblyName);
  44. Type[] ts = assembly.GetTypes();
  45. List<string> classList = new List<string>();
  46. foreach (Type t in ts)
  47. {
  48. //classList.Add(t.Name);
  49. classList.Add(t.FullName);
  50. }
  51. result.ClassName = classList;
  52. }
  53. return result;
  54. }
  55. /// <summary>
  56. /// 获取类的属性、方法
  57. /// </summary>
  58. /// <param name="assemblyName">程序集</param>
  59. /// <param name="className">类名</param>
  60. public AssemblyResult GetClassInfo(string assemblyName, string className)
  61. {
  62. AssemblyResult result = new AssemblyResult();
  63. if (!String.IsNullOrEmpty(assemblyName) && !String.IsNullOrEmpty(className))
  64. {
  65. assemblyName = path + assemblyName;
  66. Assembly assembly = Assembly.LoadFrom(assemblyName);
  67. Type type = assembly.GetType(className,true,true);
  68. if (type != null)
  69. {
  70. //类的属性
  71. List<string> propertieList = new List<string>();
  72. PropertyInfo[] propertyinfo = type.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
  73. foreach (PropertyInfo p in propertyinfo)
  74. {
  75. propertieList.Add(p.ToString());
  76. }
  77. result.Properties = propertieList;
  78. //类的构造函数
  79. //1、无参构造函数
  80. ConstructorInfo constructor = type .GetConstructor(Type.EmptyTypes);
  81. //通过构造函数初始化实例对象,该对象可以用于方法、属性的调用与设置
  82. Object constructorObject = constructor.Invoke(new  Object[]{ });
  83. //2、有参构造函数
  84. ConstructorInfo constructor = type .GetConstructor(Type.EmptyTypes);
  85. //具体几个参数,可以在new  Object[]{1 }这里面设置
  86. Object constructorObject = constructor.Invoke(new  Object[]{1 });
  87. //ConstructorInfo constructor = type .GetConstructor(Type.EmptyTypes);
  88. ////通过构造函数初始化实例对象,该对象可以用于方法、属性的调用与设置
  89. //Object constructorObject = constructor.Invoke(new  Object[]{ });
  90. //类的方法
  91. List<string> methods = new List<string>();
  92. MethodInfo[] methodInfos = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
  93. foreach (MethodInfo mi in methodInfos)
  94. {
  95. methods.Add(mi.Name);
  96. //方法的参数
  97. //foreach (ParameterInfo p in mi.GetParameters())
  98. //{
  99. //}
  100. //方法的返回值
  101. //string returnParameter = mi.ReturnParameter.ToString();
  102. }
  103. result.Methods = methods;
  104. }
  105. }
  106. return result;
  107. }
  108. }
  109. }

2、通过类名创建类实例

2.1、假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): 
Assembly assembly = Assembly.LoadFile("程序集路径,不能是相对路径"); // 加载程序集(EXE 或 DLL) 
object obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)"); // 创建类的实例

2.2、若要反射当前项目中的类可以为:

Assembly assembly = Assembly.GetExecutingAssembly(); // 获取当前程序集

object obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)");

// 创建类的实例,返回为 object 类型,需要强制类型转换

2.3、也可以为:

Type type = Type.GetType("类的完全限定名");

object obj = type.Assembly.CreateInstance(type);

2.4、还可以(建议使用这种方法):

Type type = assembly.GetType();

Object object = System.Activator.CreateInstance(type);//需要转换成对应的控件对象

======================================================= 
补充:
1)反射创建某个类的实例时,必须保证使用类的完全限定名(命名空间 + 类名)。

Type.GetType 方法返回 null 则意味搜索元数据中的相关信息失败(反射失败),请确保反射时使用类的完全限定名。

2)反射功能十分强大,没有什么不能实现的。若实现“跨程序集”,请使用第一种方法创建类的实例,并反射该实例的字段、属性、方法、事件等,然后就可以进行动态的调用它们了。

C#反射实例应用--------获取程序集信息和通过类名创建类实例的更多相关文章

  1. C#反射 获取程序集信息和通过类名创建类实例(转载)

    C#反射获取程序集信息和通过类名创建类实例 . System.Reflection 命名空间:包含通过检查托管代码中程序集.模块.成员.参数和其他实体的元数据来检索其相关信息的类型. Assembly ...

  2. C# 反射 通过类名创建类实例

    “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): ...

  3. 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值

    前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...

  4. Delphi Mercadopago支付【支持支持获取账户信息和余额、创建商店,商店查询、创建二维码、二维码查询、创建订单、订单查询、订单退款等功能】

    作者QQ:(648437169) 点击下载➨Delphi Mercadopago支付 [Delphi Mercadopago支付]支持 支持支持获取账户信息和余额.创建商店,商店查询.创建二维码.二维 ...

  5. XAML实例教程系列 - XAML传递参数到值转换类实例 八

    Kevin Fan分享开发经验,记录开发点滴 XAML实例教程系列 - XAML传递参数到值转换类实例 2012-06-28 05:25 by jv9, 508 阅读, 0 评论, 收藏, 编辑 继上 ...

  6. WPF 获取程序路径的一些方法,根据程序路径获取程序集信息

    一.WPF 获取程序路径的一些方法方式一 应用程序域 //获取基目录即当前工作目录 string str_1 = System.AppDomain.CurrentDomain.BaseDirector ...

  7. Java反射机制能够获取的信息,与应用

    一.什么是Java反射机制? [1]反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法: [2]对于任意一个对象,都能够调用它的任意一个属性和方法: 像这种动态获取类的信息以及动 ...

  8. java反射子之获取方法信息(二)

    一.获取方法 1.方法作用. 2. 二.获取方法信息.(修饰符,返回值,方法名称,参数列表,抛出的异常). ############################################## ...

  9. Python3类和实例之获取对象信息

    当我们拿到一个对象的引用时,如何知道这个对象是什么类型,有哪些方法呢 使用type() 判断对象类型使用type()函数 基本类型都可以用type()判断 <class 'int'> &g ...

随机推荐

  1. 12天学好C语言——记录我的C语言学习之路(Day 10)

    12天学好C语言--记录我的C语言学习之路 Day 10: 接着昨天的指针部分学习,有这么一个题目: //还是四个学生,四门成绩,只要有学生一门功课没及格就输出这个学生的所有成绩 /*//progra ...

  2. OpenJudge/Poj 1125 Stockbroker Grapevine

    1.链接地址: http://poj.org/problem?id=1125 http://bailian.openjudge.cn/practice/1125 2.题目: Stockbroker G ...

  3. Percona-Server-5.5.15源码安装

    [root@localhost rpm]# ll total 19148 -rw-r--r-- 1 root root   562628 Jan 18  2007 bison-2.3-2.1.x86_ ...

  4. Linux – RedHat7 / CentOS 7 忘记root密码修改

    1.(a) 开机出现grub boot loader 开机选项菜单时,立即点击键盘任意鍵,boot loader 会暂停. (b) 按下’e’,编辑选项菜单(c) 移动上下鍵至linux16 核心命令 ...

  5. JavaScript的事件监听、捕获和冒泡

    在前端开发中,我们经常需要对某些事件进行监听.这样只要在指定的元素上触发了该事件,就会执行一个回调函数来进行相关的操作. 而JavaScript中事件监听的方法总共有三种,分别如下: element. ...

  6. 我爱工程化 之 gulp 使用(二)

    上一篇  介绍了gulp的安装.环境等配置.基本使用,那么现在,我们快走进 速8,深入了解吧...... 一.各种安装.环境配置.插件安装(参考上一篇文章) 二.项目基本目录结构 三.编写 gulpf ...

  7. Struts2 Annotation 默认返回Tiles2布局

    Struts2的annotation方式很简约,特别实在遵从默认约定的时候就根本不需要配什么struts.xml.网上关于Annotation约定大于配置的教程也很多,其中也不乏将xml版struts ...

  8. UILabel 属性祥记

    创建label UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 280, 80)]; 设置背景色 label1. ...

  9. HTTP - PUT 上传文件/Shell (二)

    上一篇文章 HTTP - PUT 上传文件/Shell 讲到自己搭了一个环境,去测试HTTP - PUT上传Shell.最近又遇到几个PUT上传的例子,也成功上传了几次,来分享一下思密达. 0x00 ...

  10. Cocos2dx坐标转换

    Cocos2dx坐标转换 这段时间加班有点猛,没有太多时间来写博客了,ok,继续完成任务: 前言 这里将会重点介绍四个函数: convertToNodeSpace convertToNodeSpace ...