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 ...
随机推荐
- java单个方法达到了65536字节的限制
可以使方法更小的一件事是关闭调试.打开调试时,每一行(带代码)都有一个标记该行的语句. 不.重构代码.没有方法应该那么久.永远. Write small methods! 说真的:任何IDE都会指导您 ...
- python里的引用、浅拷贝、深拷贝
参考: 1.http://wsfdl.com/python/2013/08/16/%E7%90%86%E8%A7%A3Python%E7%9A%84%E6%B7%B1%E6%8B%B7%E8%B4%9 ...
- 请教如何改善C#中socket通信机客户端程序的健壮性
我是做Socket的新手,最近做了一个Socket客户端程序,连接Server的时候,如果server存在,并且允许连接的话,程序无错,正常执行:但是如果Server不存在,或者拒绝连接,程序就会卡住 ...
- 关于C++ 中POD类型的解析
转自: http://liuqifly.spaces.live.com/blog/cns!216ae3a149106df9!221.entry (C++-98:1.8;5)给出的定义:将对象的各字节拷 ...
- matlab中find函数的使用说明
matlab中如何统计一个矩阵M中零的个数 size(find(M==0),1) 原文:http://blog.sina.com.cn/s/blog_707b64550100rbh3.html fin ...
- (算法)Partition方法求数组第k大的数
如题,下面直接贴出代码: #include <iostream> using namespace std; int Partition(int* A,int left,int right) ...
- C#.NET常见问题(FAQ)-如何批量增加或取消注释
选中一批文本之后 批量增加注释:Ctrl+K Ctrl+C 批量取消注释:Ctrl+K Ctrl+U 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku. ...
- Office安装错误1402的解决
Office软件是我们工作是必备的,为了统一公司的办工软件,要把所有的WPS和Office2003版本全部换顾Office2010.在Win7下安装Office2010一般都不会存在什么大的问题,但遇 ...
- sqlplus的使用
1.连接数据库 sqlplus / as sysdba 2.连接到远程数据库 sqlplus 用户名/密码@服务命名 3.遇到&会当成变量,一般是不需要的,可以关掉 SQL> set d ...
- 多mysql实例下开发需要注意主从同步延迟
今天晚上服务器上线测试,遇到了一个问题! 往数据库写了一条数据之后,再读取该记录,居然读不出来,报空指针.十分费解,喊来开发组长定位问题.他的解释是:写操作用的是主库,而读操作用的是从库.在写库写完之 ...