using System.Reflection;

1.载入Dll

 Assembly asm=Assembly.LoadFile(FullPath);//FullPath 为Dll所在位置的全路径。

2.取得所需要的类的类型

Type t = asm.GetType("namespaceName.className");//命名空间名.类名

3.建立此类型的对象(相当于 new)

object o = Activator.CreateInstance(t); //创建Type t类型的对象

4.取得类中想要执行的方法

MethodInfo me = t.GetMethod("TestFunction");

5.取得此方法所需参数列表

ParameterInfo[] para=me.GetParameters();

6.创建参数类型的对象,并传入参数Array

Type re = asm.GetType("TestDll.ReturnClass");  //我的参数类型是TestDll命名空间下 ReturnClass类
object reo = Activator.CreateInstance(re);
object[] r = { reo };

7.调用函数

Object rr = me.Invoke(o, r);  //如果调用的是非异步函数,此时object rr就是函数的返回值。

8.如果调用的是异步函数

Task task = me.Invoke(o, r) as Task;
await task;
object result = task.GetType().GetProperty("Result").GetValue(task, null); //result就是异步函数的返回值

9.反射常用操作

//取得o实例中propertyName属性的值value
Type t = asm.GetType("TestDll.TestClass");
object o = Activator.CreateInstance(t);
object getproperty = t.GetProperty("propertyName").GetValue(o, null); //方法一
object getproperty1 = o.GetType().GetProperty("propertyName").GetValue(o, null); //方法二 //取得枚举类型中的指定元素
Type enumType = asm.GetType("namespaceName.enumName");
foreach(var name in Enum.GetValues(enumType))
{
   if("elementname"==name.ToString())
   {
Convert.ToInt32(name);//转化制定元素为int
   }
}
string[] strname=Enum.GetNames(enumType);//取得枚举所有元素名

10.总结

大概就是,在你不知道Dll的内部结构的情况下,可以通过反射获得Dll内所有信息

C#反射调用外部Dll,执行其中异步函数并取返回值的更多相关文章

  1. C# 调用外部dll(转)

    C# 调用外部dll   一.      DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最 ...

  2. C#调用外部DLL介绍及使用详解

    一.      DLL与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件 ...

  3. C#反射调用其它DLL的委托事件 传值

    C#反射调用其它DLL的委托事件 传值在插件式开发.我们要调用其它插件或模块的委托事件时.那么我们需要通过反射. 复制代码namespace Module2{ /// <summary> ...

  4. 易语言调用外部DLL详细实例教程

    一.准备工作 一.工具:易语言 二.准备一个DLL 1)打开易语言-新建一个Windows动态链接库 2)然后右键新建一个子程序或者用快捷键:Ctrl+N .然后写上代码.我这里写一个 2个字符串拼接 ...

  5. ASP.NET、C#调用外部可执行exe文件--多种方案

    一. try { //方法一 //调用自己的exe传递参数 //Process proc = new Process(); //proc.StartInfo.FileName = @"D:\ ...

  6. [转] C#调用外部DLL

    原文地址 每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍.首先,您需要了解什么是托管,什么是非托管.一般可以认为:非托管代码主要是基于win 32平台开发的DLL,ac ...

  7. 用C#调用外部DLL

    1.有时候需要用C#调用外部的dll,例如c++写的dll,首先需要保证dll的编译环境与本项目的环境是相同的,例如都是x86位或者x64位 2.调用声明和dll内的声明一致: function Te ...

  8. NX二次开发-C#使用DllImport调用libufun.dll里的UF函数(反编译.net.dll)调用loop等UF函数

    在写这篇文章的时候,我正在头晕,因为下班坐车回家,有些晕车了.头疼的要死.也吃不下去饭. 版本:NX11+VS2013 最近这一年已经由C++过度到C#,改用C#做应用程序开发和NX二次开发. C#在 ...

  9. Java调用动态链接库so文件(传参以及处理返回值问题)

    刚来到公司,屁股还没坐稳,老板把我叫到办公室,就让我做一个小程序.我瞬间懵逼了.对小程序一窍不通,还好通过学习小程序视频,两天的时间就做了一个云开发的小程序,但是领导不想核心的代码被别人看到,给了我一 ...

随机推荐

  1. VS2017集成FastReport.Net并将模板保存到数据库

    本着开发与实施分离的思想,设计一个通用的报表设计窗体显得尤为重要(下图为图一): 要求与优点: I.报表设计窗体支持所有单据调用,一种单据支持多个打印模板. II.报表模板存储在数据库中.一是支持客户 ...

  2. ABP框架入门踩坑-使用MySQL

    使用MySQL ABP踩坑记录-目录 起因 因为我自用的服务器只是腾讯云1核1G的学生机,不方便装SQL Server,所以转而MySQL. 这里使用的MySQL版本号为 8.0. 解决方案 删除Qi ...

  3. OpenStack kolla 多 region 部署配置

    region one: cat /etc/kolla/globals.yml openstack_region_name: "RegionOne" multiple_regions ...

  4. jzoj100031

    這題是結論題 好玄學,不懂 代碼: #include<bits/stdc++.h> using namespace std; struct no{ int v,p; bool operat ...

  5. poj1511

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 25099   Accepted: 829 ...

  6. 六,mysql优化——小知识点

    1,选择适当的字段类型,特别是主键 选择字段的一般原则是保小不保大,能占用字节小的字段就不用大字段.比如主键,建议使用自增类型,这样节省空间,空间就是效率!按4个字节和按32个字节定位一条记录,谁快谁 ...

  7. mysql_load_data及权限管理

    ———————————————————————————————————————— 添加权限: The only priv_type values you can specify for a table ...

  8. phpqrcode 分别生成普通、带logo、带背景带logo二维码

    前提:下载好 phpqrcode 类库 1.生成普通二维码 //引入类库 include('phpqrcode/phpqrcode.php'); //二维码里面的链接地址 $url="htt ...

  9. SQL实现数据行列转换

    前言: 在日常的工作中,使用数据库查看数据是很经常的事,数据库的数据非常多,如果此时的数据设计是一行行的设计话,就会有多行同一个用户的数据,查看起来比较费劲,如果数据较多时,不方便查看,为了更加方便工 ...

  10. Mac 10.12允许任何来源

    sudo spctl --master-disable 然后即可设置.