动态调用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 );
        }
    }
}



  说这么多,代码才是最实在的 :
  点击下载代码和示例
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值