C#利用反射机制调用dll
Assembly ass=Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dll
Assembly.LoadFile 只加载指定文件,并不会自动加载依赖程序集.Assmbly.Load无需后辍名,加载dll后,需要使用dll中某类.
Type type=ass.GetType(“TypeName”);//利用类型的命名空间和名称获得类型需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略
Object obj = Activator.CreateInstance(type,params[]);//利用指定的参数实例话类型,调用类型中的某个方法:
MethodInfo mi=type.GetMethod(“MehtodName”);//通过方法名称获得方法
mi.Invoke(obj,params[]);//根据参数直线方法,返回值就是原方法的返回值
Assembly ass = System.Reflection.Assembly.LoadFile(@"d:\TestReflect.dll");//要绝对路径
type = ass.GetType("Webtest.ReflectTest");//必须使用名称空间+类名称
System.Reflection.MethodInfo method = type.GetMethod("WriteString");//方法的名称
obj = ass.CreateInstance("Webtest.ReflectTest");//必须使用名称空间+类名称
string s = (string)method.Invoke(obj,new string[]{"jianglijun"}); //实例方法的调用
实际操作使用,创建一个类库项目。首先创建一个类:用于做简单的运算测试
namespace dlltest
{
public class Class1
{
decimal x = ;
decimal y = ; public decimal add(decimal x, decimal y)
{
return x + y;
} public decimal sub(decimal x , decimal y)
{
return x - y;
} public decimal mul(decimal x, decimal y)
{
return x * y;
}
public decimal div(decimal x, decimal y)
{
return x / y;
}
}
}
将上面的程序生成dll 类库,放到 第二个项目(控制台程序,这里只作测试)的debug目录下。
///此处略去部分代码,用于获取两个输入的数字, 可自定义或读取输入 Assembly ass = Assembly.Load("dlltest"); //加载dll Type type = ass.GetType("dlltest.Class1"); //获取该类 命名空间 + 类名, Class1 是我的类名
MethodInfo mi1 = type.GetMethod("add"); //获取方法
MethodInfo mi2 = type.GetMethod("sub");
MethodInfo mi3 = type.GetMethod("mul");
MethodInfo mi4 = type.GetMethod("div");
Object obj = ass.CreateInstance("dlltest.Class1");//必须使用名称空间+类名称 //以下是调用该四种方法
decimal rs1 = (decimal)mi1.Invoke(obj, new object [] { x, y }); //obj, new decimal[] {a, b}
decimal rs2 = (decimal)mi2.Invoke(obj, new object[] { x, y });
decimal rs3 = (decimal)mi3.Invoke(obj, new object[] { x, y });
decimal rs4 = (decimal)mi4.Invoke(obj, new object[] { x, y }); Console.WriteLine();
Console.WriteLine("加法结果: " + rs1);
Console.WriteLine("减法结果: " + rs2);
Console.WriteLine("乘法结果: " + rs3);
Console.WriteLine("除法结果: " + rs4);
以下是结果显示:
假如不想将dll放到 debug目录下,可以获取 应用程序的主目录,然后将dl 放到主目录中。(此处只是一种方法,你可以不需要复制过来,而直接将目录指向 dlltest.dll的生成目录)
只需如下处理:
DirectoryInfo dir = new DirectoryInfo(AppDomain.CurrentDomain.SetupInformation.ApplicationBase).Parent.Parent;
string str = dir.FullName; //获取或设置包含该应用程序的目录的名称
Assembly ass = Assembly.Load(str + "\\" + "dlltest"); //加载dll //后续操作不变
谢谢阅读!分享共进步
C#利用反射机制调用dll的更多相关文章
- C#利用反射动态调用DLL并返回结果,和获取程序集的信息
反射的基本概念: .Net Framework 中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息 创建Assembly和Entity两个程序集,在Assembl ...
- 【转】Java利用反射机制访问私有化构造器
Java利用反射机制访问私有化构造器 博客分类: java 我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...
- java 中利用反射机制获取和设置实体类的属性值
摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...
- Java——利用反射机制将表单数据自动填充到JavaBean中
以一个案例介绍反射机制的一种常见的使用场景,以及具体实现. 1.本文案例 在编写Java Web应用程序时,使用表单提交数据是一个必不可少的环节,后台对于前台使用表单提交的数据需要能够从请求中解析,并 ...
- android 利用反射机制获取drawable中所有的图片资源
public List<Map<String,Object>> getGridData() { list=new ArrayList<Map<String,Obje ...
- Android利用反射机制为实体类属性赋值
在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面 ...
- java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值
1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...
- C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址)
from:https://blog.csdn.net/poxiaohai2011/article/details/27555951 //C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西 ...
- java 通过反射机制调用某个类的方法
package net.xsoftlab.baike; import java.lang.reflect.Method; public class TestReflect { public s ...
随机推荐
- win7下安装配置ftp服务器
1. win7操作系统自带了ftp组件,所以不需要另外下载.只需要在控制面板中,添加或删除组件中启用即可. 2. 在管理上,ftp和iis是属于同一个目录的.ftp也可以算是internet info ...
- 基于tomcat7 web开发中的一点小东西
控制台: org.apache.jasper.compiler.TldLocationsCache tldScanJar 信息: At least one JAR was scanned for TL ...
- Myeclipse设置快捷键
快捷键中把我们习惯性使用的Alt+/进行代码自动补齐的快捷键改为了ctrl+空格,大家知道这是切换中英文输入法的键,所以需要更改这个快捷键, 1.选择MyEclipse6.0菜单栏中的Window-& ...
- java使用POI获取sheet、行数、列数
FileInputStream inp = new FileInputStream("E:\\WEIAN.xls"); HSSFWorkbook wb = new HSSFWork ...
- 显示Mysql中的所有用户
在mysql中如何显示所有用户? 1.show databases显示所有数据库 2.show tables显示所有数据表 3.select current_user();显示当前用户 4.显示所有用 ...
- ELK kibana查询与过滤
在kibana中,可通过搜索查询过滤事务或者在visualization界面点击元素过滤. 创建查询 在Discover界面的搜索栏输入要查询的字段.查询语法是基于Lucene的查询语法.允许布尔运算 ...
- go语言基础之可见性规则验证
1.可见性规则验证 如果想使用别的包的函数.结构体类型.络构体成员. 函数名.类型名,结构体成员变量名,首字母必段大写,可见. 如果首字母是小写,只能在同一个包里使用. 文件夹样例: 示例: vi t ...
- 日程管理app
背景: 普通的笔记本显然具有保存占用较大空间的弊端.而笔记类app又借助于虚拟按键输入,便利度稍逊.假设使用电脑,又产生了较大空间的弊端. 手段: 成熟的书写识别技术 方法: 一.专有的划分有制定格子 ...
- ObservableCollection
1)可以使绑定控件与基础数据源保持同步2)还可以在您添加.删除.移动.刷新或替换集合中的项目时引发 CollectionChanged 事件3)还可以在您的窗口以外的代码修改基础数据时做出反应4)相互 ...
- COM如何区分套间线程(apartment thread)和自由线程(free thread)