动态调用 Win32 Function(API)

动态调用Win32 Function(API)

在很多场合,我们需要动态进行平台调用。
.Net 平台下不同于 Win32,无法直接通过函数指针调用函数,并且对于 DLL 也只能事先声明函数签名后才能调用。

下面是动态平台调用的解决方案
1.通过 Win32 DLL 进行平台调用
缺点 : 无法和.Net进行交互。
参看 : 无

2.通过定义动态程序集声明函数签名并反射调用平台调用
缺点 : 效率低下,资源占用过大,并且无法释放动态程序集所占用的资源,如果使用AppDomain,虽然可以释放动态程序集,但是却会占用更多资源。
参看 : 无

3.通过定义动态程序集生成全局方法,在全局方法中使用 MSIL 指令调用函数指针。
缺点 : 除了效率可以接受外,其他缺点同上。
参看 : http://blog.csdn.net/pansiom/archive/2006/01/01/568096.aspx

4.使用 System.Runtime.InteropServices.Marshal类的GetDelegateForFunctionPointer方法根据委托来动态调用函数指针
缺点 : 必须现定义好委托才可以调用函数指针,失去了"动态"的效果
参看 : http://www.cnblogs.com/rick/archive/2006/07/13/449849.aspx

5.在 DynamicMethod 中使用 MSIL 指令调用函数指针
缺点 : 几乎没有
参看 : 本文内容

在这里,我们就是使用 DynamicMethod 来完成动态平台调用,他的好处主要有以下几个:
1.轻量:占用很少的资源,当不使用 DynamicMethod 时,可以释放资源。
2.效率:IronPython 何以比 CPython 高效?就是因为借助了 DynamicMethod 和 JIT。
3.灵活:你几乎可以使动态调用任何定义的Win32 Function,无论是调用约定不同还是参数中有结构。

MSDN中对 DynamicMethod 的描述:
可以使用 DynamicMethod 类在运行时生成和执行方法,而不必生成动态程序集和动态类型来包含该方法。动态方法是生成和执行少量代码的最有效方式。

实例代码:
using System;
using System.Collections.Generic;
using System.Text;
using Zealic.Windows;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//测试1
DynamicLibrary hilib = new DynamicLibrary("hi.dll");
NativeMethodBuilder hiBuilder = new NativeMethodBuilder();
NativeMethod method = hiBuilder.MakeMethod(hilib, "func");
Console.WriteLine("请关闭弹出的对话框 'Hille'");
method.Invoke();
hilib.Free();

//测试2
DynamicLibrary krnlib = new DynamicLibrary("kernel32.dll");
NativeMethodBuilder beepBuilder = new NativeMethodBuilder();
beepBuilder.ParameterLength = 2;
beepBuilder.SetParameterInfo(0, typeof(int));
beepBuilder.SetParameterInfo(1, typeof(int));
method = beepBuilder.MakeMethod(krnlib,"Beep");
Console.WriteLine("听,你的机器在尖叫!");
method.Invoke(1000, 1000);
Console.WriteLine("按任意键退出!");
Console.ReadKey(true);
}
}
}

说这么多,代码才是最实在的 :

DynamicMethod相关推荐

  1. (转)用DynamicMethod提升ORM系统转换业务数据的性能

    原文 用DynamicMethod提升ORM系统转换业务数据的性能 在上一篇文章<把Sql数据转换为业务数据的几种方法>中提到了ORM系统把Sql数据转换为业务数据的几种方法,但这些方法都 ...

  2. 在Silverlight中使用DynamicMethod(动态方法)

    DynamicMethod 类(位于System.Reflection.Emit名空间下), 用于定义并表示一种可编译.执行和 丢弃的动态方法.        而下面是微软对于DynamicMetho ...

  3. DynamicMethodHelper R2 2012-08-14 DynamicMethod ILGenerator.Emit

    转载于:https://www.cnblogs.com/Microshaoft/archive/2012/08/13/2637254.html

  4. EnterLib PIAB又一个BUG?

    在<这是EnterLib PIAB的BUG吗?>一文中我们讨论了PIAB关于抽象基类的BUG,今天又发现了一个新的问题.问题的起因源于<IoC+AOP的简单实现>这篇文章,因为 ...

  5. 利用反射对应数据库字段

    #region DataSet数据读取protected delegate P GetDataSetItemHandler<P>(DataRow row);internal static ...

  6. Java多线程发展简史

    摘自: http://www.raychase.net/698 这篇文章,大部分内容,是周五我做的一个关于如何进行Java多线程编程的Knowledge Sharing的一个整理,我希望能对Java从 ...

  7. 给热爱学习的同学们推荐一些顶级的c# Blogs链接

    在IT行业,中文的资料永远都比英文的慢几个月,而且原创性的也少得可怜,有空时,不妨去这些英文技术BLOG溜达溜达,也许会有意外的惊喜. 好的C#博客应该符合这些条件: 有用的新闻.信息.技巧和代码例子 ...

  8. 使用Emit的TypeBUilder动态创建接口程序集的性能报告。

    方案一: 使用RealProxy实现接口,并操作get.set 方案二: 使用Emit创建接口实现类,并使用DynamicMethod构造创建constructor,操作getset 方案三: 使用e ...

  9. Windbg学习 (0x0013) 扩展命令-SOS

    https://msdn.microsoft.com/en-us/library/bb190764.aspx 命令 描述 BPMD [<module name> <method na ...

最新文章

  1. Linux - 后台运行 ctrl + z , jobs , bg , fg
  2. 数据中心(机房)监控方案
  3. 的微波感知_微波遥感的特点
  4. g++默认参数_C ++默认参数| 查找输出程序| 套装1
  5. iPhone XS Max第三方售价低于7千元 引用户疯抢
  6. python调用hive与java调用区别_python3.6.5基于kerberos认证的hive和hdfs连接调用方式
  7. 在某个时间段查找某连续出现问题
  8. js typeof 能得到哪几种类型
  9. Android连接网络立即同步时区
  10. autotools使用总结
  11. 基于c语言的学生成绩管理系统论文,C语言学生成绩管理系统论文
  12. 何宾 单片机原理及应用_stc单片机原理及应用.pdf
  13. golang http长连接
  14. C语言小白教程第三讲-常量
  15. 开发人员系统功能设计常用办公软件分享
  16. SpringAOP静态代理
  17. Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过浏览器审查元素解析真实网页地址...
  18. shell+ftp+中文乱码_linux系统(本例为Centos)ftp上传中文名文件乱码或者显示问号解决方法 - 老牛博客...
  19. 鸿蒙与北斗星云手机,为何其他国产手机不接入鸿蒙?王成录一语道出真谛
  20. 博客园及相关学习地址收录

热门文章

  1. istio-proxy性能洞察之路---性能调研的终点、调优之路的出发点
  2. 20145206邹京儒、20145236冯佳 实验一
  3. 爬虫入门概念与硬核实战巩固(一)
  4. bWAPP之环境搭建及HTML注入
  5. ChatGPT推出第四代GPT-4!不仅能聊天,还可以图片创作!
  6. 【转载】CAD快捷键
  7. VS 用cout输出字符串
  8. STM32-中断-NVIC与EXTI
  9. 【OpenCL】求矩阵所有元素的和——归约算法
  10. plor 回归的r方_线性回归中的R方是什么意思