反射可以不但用来读取元数据,还可以使用反射从编译时还不清楚的类型中动态创建程序集,此案例摘自C#高级编程。

首先先创建一个控制台应用程序,然后添加一个类库,类库名称为CalculatorLib,如下图所示:

CalculatorLib程序集中有两个方法,参数是x和y,一个方法返回两数之和,另一个方法返回两数之差,代码如下图所示:

namespace CalculatorLib
{public class Calculator{public double Add(double x, double y) => x + y;public double Subract(double x, double y) => x - y;}
}

接下来我们要在控制台车程序中实例化类Calculator,并调用其中的方法。控制台中的代码如下图所示:

class Program{private const string CalculatorLibPath = @"D:/MyProjects/MyConsoleApplication1/CalculatorLib/bin/Debug/CalculatorLib.dll";private const string CalculatorLibName = "CalculatorLib";private const string CalculatorTypeName = "CalculatorLib.Calculator";static void Main(string[] args){ReflectionOld();}public static object GetCalculator(){Assembly assembly = Assembly.LoadFile(CalculatorLibPath);//根据指定路径动态加载程序集return assembly.CreateInstance(CalculatorTypeName);//实例化程序集中的类}public static void ReflectionOld(){double x = 3;double y = 4;object calc = GetCalculator();object result = calc.GetType().GetMethod("Add").Invoke(calc, new object [] { x, y });object result2 = calc.GetType().GetMethod("Subract").Invoke(calc,new object[] { x,y});Console.WriteLine($"x + y = {result}");Console.WriteLine($"x - y = {result2}");Console.Read();}}

运行结果如下图所示:

第二种方式是利用dynamic进行,dynamic语法会比上面第一种方法简单,但是处理起来消耗更多的时间和资源。关于dynamic会在以后中学习。修改代码如下图所示:

class Program{private const string CalculatorLibPath = @"D:/MyProjects/MyConsoleApplication1/CalculatorLib/bin/Debug/CalculatorLib.dll";private const string CalculatorLibName = "CalculatorLib";private const string CalculatorTypeName = "CalculatorLib.Calculator";static void Main(string[] args){ReflectionNew();}public static object GetCalculator(){Assembly assembly = Assembly.LoadFile(CalculatorLibPath);//根据指定路径动态加载程序集return assembly.CreateInstance(CalculatorTypeName);//实例化程序集中的类}public static void ReflectionNew(){double x = 3;double y = 4;dynamic calc = GetCalculator();//类型为dynamicdouble result = calc.Add(x, y);Console.WriteLine($"x + y = {result}");double result2 = calc.Subract(x, y);Console.WriteLine($"x - y = {result}");Console.Read();}}

运行结果是一样的:

我个人认为反射是框架级的技术,由此案例为基础可以为以后组件式开发打下根基,并极大的降低程序的耦合,棒!

C#利用反射实现动态加载程序集简单案例相关推荐

  1. Java反射-静态/动态加载类

    title: Java反射-静态/动态加载类 date: 2019-05-28 18:50:00Java反射-静态/动态加载类 Class 类是对象,是java.lang.Class类的实例对象.任何 ...

  2. 关于c#中 的动态加载程序集

    最近在写一个解析分析程序,需要动态加载卸载程序集(其实就是一个简单的插件框架),我的 思路是在主程序的目录下,创建一个assemblis目录,用来存放插件目录,如果加载插件时将其复制到 此目录,然后主 ...

  3. python 反射和动态加载_Python的反射

    什么是反射 反射是一个很重要的概念,它可以把字符串映射到实例的变量或者实例的方法然后可以去执行调用.修改等操作.它有四个重要的方法: getattr 获取指定字符串名称的对象属性 setattr 为对 ...

  4. Assembly.Load动态加载程序集而不占用文件

    方式一:占用文件的加载 Assembly assembly = Assembly.Load(path); 用上面的方法可以动态的加载到dll,但是用这种方法加载到的dll一直到程序运行结束都是占用的d ...

  5. Python爬虫——利用PhantomJS下载动态加载图片

    在浏览网页过程中,我们会遇到一些让人心动的图片,这时我们需要将它保存在本地.一般我们用BeautifulSoup可以解析静态网页,但很多时候我们遇到的都是动态加载的图片,无法再利用urllib模块操作 ...

  6. html 调用c#dll中的控件,C#实现反射调用动态加载的DLL文件中的方法和在窗体中加载DLL文件的用户控件...

    反射的作用: 1. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型 2. 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射. ...

  7. C#实现反射调用动态加载的DLL文件中的方法

    反射的作用: 1. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型  2. 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射. ...

  8. c#实现动态加载Dll

     原理如下: 1.利用反射进行动态加载和调用.  Assembly assembly=Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将此程序集所依赖的程序集 ...

  9. C#动态加载DLL(转)

    利用反射进行动态加载和调用. Assembly ass=Assembly.LoadFrom(DllPath); //利用dll的路径加载 加载dll后,需要使用dll中某类. Type type=as ...

最新文章

  1. 当 python Pip 升级失败
  2. strcpy与strncpy的区别
  3. JAVA web项目转客户端(nativefier)
  4. 4.01~~Median
  5. 机房速度和带宽测试的简单方法
  6. Java异常处理基础
  7. linux 禁ping设置
  8. Android插件化开发之AMS与应用程序(客户端ActivityThread、Instrumentation、Activity)通信模型分析
  9. 在c++中一个空类占用的字节数
  10. 我的世界java骷髅马_我的世界1.9版本新功能曝光 骷髅马正式加入
  11. Oracle学习总结2-数据处理
  12. linux用户开机.bashrc,验证linux shell在启动时会自动执行用户主目录下的.bashrc脚本...
  13. 米家扫地机器人重置网络_谁家扫地机器人悄声打扫更干净,科沃斯DEEBOT N3对比米家1S...
  14. leetcode56. Merge Intervals
  15. windows下批量更改文件名
  16. 【读书笔记】商业自传-PayPal程序员-硅谷钢铁侠-埃隆·马斯克,SpaceX CEO、特斯拉公司CEO、太阳城公司董事会主席。
  17. 三维激光扫描在堆体体积测算中的应用
  18. MTK 平台TP 驱动
  19. 下拉列表—DropDownMenu的使用解析
  20. oracle12c 环境需求,Oracle12C之环境准备工作

热门文章

  1. 工控领域的网络攻击 食尸鬼行动深入解读Operation Ghoul
  2. TODO:macOS上ThinkPHP5和Semantic-UI集成
  3. 微信公众平台开发5:翻译功能
  4. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑
  5. scrollTop的兼容性小结
  6. IE6,IE7 Firefox 兼容问题
  7. 详解:JVM内存调优参数
  8. Linux为什么受欢迎?
  9. 服务器centos怎么部署_我什么都不会,怎么拥有自己的个人博客呢
  10. oracle不要重复记录,Oracle中去重复记录 不用distinct