C#利用反射机制调用dll

时间:2022-09-16 09:09:14
利用反射进行动态加载和调用.
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);

以下是结果显示:

C#利用反射机制调用dll

假如不想将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的更多相关文章

  1. C#利用反射动态调用DLL并返回结果,和获取程序集的信息

    反射的基本概念: .Net Framework 中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息 创建Assembly和Entity两个程序集,在Assembl ...

  2. 【转】Java利用反射机制访问私有化构造器

    Java利用反射机制访问私有化构造器 博客分类: java   我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...

  3. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

  4. Java——利用反射机制将表单数据自动填充到JavaBean中

    以一个案例介绍反射机制的一种常见的使用场景,以及具体实现. 1.本文案例 在编写Java Web应用程序时,使用表单提交数据是一个必不可少的环节,后台对于前台使用表单提交的数据需要能够从请求中解析,并 ...

  5. android 利用反射机制获取drawable中所有的图片资源

    public List<Map<String,Object>> getGridData() { list=new ArrayList<Map<String,Obje ...

  6. Android利用反射机制为实体类属性赋值

    在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面 ...

  7. java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值

    1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...

  8. C&num; 中利用反射机制拷贝类的字段和属性&lpar;拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址&rpar;

    from:https://blog.csdn.net/poxiaohai2011/article/details/27555951 //C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西 ...

  9. java 通过反射机制调用某个类的方法

    package net.xsoftlab.baike; import java.lang.reflect.Method; public class TestReflect {     public s ...

随机推荐

  1. JavaScript 嵌套 书名号 查询

    字符串中查找嵌套书名号 ,一开始想用正则来做的,最后发现正则不可能达到我的需求(可能是我正则理解不够,哈哈),所以写下了这个方法:只做了三层,如果你要更多,可以自己添加,哈哈//提取查询关键字,sou ...

  2. 我爱模仿app之格瓦拉客户端

    最近有很多人问我,这个效果该怎么实现,那个功能该怎么实现.所以我准备开个专题,找一些app模仿,写一些示例代码,以供大家参考. 第一个下手的就是格瓦拉,没用过的可以下载看看,效果做的还是可以的,专场, ...

  3. Telerik XML 数据源绑定的问题

    Telerik GridView 默认的 XElement 数据源的直接绑定,会导致内置的sort, filter ,group等功能无法使用. 原因在于Telerik GridView的那些功能是根 ...

  4. Educational Codeforces Round 4 C&period; Replace To Make Regular Bracket Sequence 栈

    C. Replace To Make Regular Bracket Sequence 题目连接: http://www.codeforces.com/contest/612/problem/C De ...

  5. linux 挂载 镜像文件

    挂接命令(mount) 命令格式: mount [-t vfstype] [-o options] device dir 其中: 1.-t vfstype指定文件系统的类型,通常不必指定.mount会 ...

  6. Android5&period;0水波纹效果ripple实现

    1.如何设置波纹效果 // 波纹有边界 android:background="?android:attr/selectableItemBackground" // 波纹超出边界 ...

  7. C语言精要总结-指针系列(二)

    此文为指针系列第二篇: C语言精要总结-指针系列(一) C语言精要总结-指针系列(二) 指针运算 前面提到过指针的解引用运算,除此之外,指针还能进行部分算数运算.关系运算 指针能进行的有意义的算术运算 ...

  8. spring boot 单元测试

    Java新手 纯记录 @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = OutDemoApplication.clas ...

  9. maven&plus;Spring&plus;SpringMVC&plus;Hibernate快速搭建

    目录结构: pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...

  10. &lbrack;luogu4072&rsqb;&lbrack;bzoj4518&rsqb;&lbrack;SDOI2016&rsqb;征途【动态规划&plus;斜率优化】

    题目分析 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路 ...