提供 .Net 下调用非托管Dll内部函数的快捷方法

提供 .Net 下调用非托管Dll内部函数 的快捷方法2008年12月12日 星期五 下午  10 : 241 ,用C#实现一个DllImported 类,内部利用DllImport 访问kernel32.dll的LoadLibrary和GetProcAddress

       [DllImport(
" kernel32.dll " , EntryPoint  =   " LoadLibrary " )]
        
public   static   extern   int  LoadLibrary(  string  lpLibFileName );
        [DllImport(
" kernel32.dll " , EntryPoint  =   " GetProcAddress " )]
        
public   static   extern  IntPtr GetProcAddress( int  hModule,  string  lpProcName);

2 ,利用Marshal.GetDelegateForFunctionPointer 将非托管指针转化为委托

类代码如下:

using  System;
using  System.Collections.Generic;
using  System.Text;

/////////////// 添加命名空间 //////////////////////// /
using  System.Runtime.InteropServices;


namespace  DllImported
{
    
public   class  CDllImported
    {

        [DllImport(
" kernel32.dll " , EntryPoint  =   " LoadLibrary " )]
        
public   static   extern   int  LoadLibrary(  string  lpLibFileName );
        [DllImport(
" kernel32.dll " , EntryPoint  =   " GetProcAddress " )]
        
public   static   extern  IntPtr GetProcAddress( int  hModule,  string  lpProcName);
        
public  CDllImported()
        {           
        }
        
///   <summary>
        
///  获取非托管DLL内部函数
        
///   </summary>
        
///   <param name="delegateName"> 托管函数定义类型,用typeof(your delegate typeof)传入  </param>
        
///   <param name="dllName"> Dll路径  </param>
        
///   <param name="procName"> 要获取的函数名称 </param>
        
///   <returns></returns>
         public   object    GetApi (Type delegateName,  string  dllName, string  procName)
        {
            IntPtr api 
=  GetProcAddress(LoadLibrary(dllName), procName);
            
return  ( object )Marshal.GetDelegateForFunctionPointer(api, delegateName);
        }
         
    }
}


编译产生一个DllImported的 dll组件。

在Vb里调用Api

1  先添加上面的组件

2     定义委托 Delegate Function msgDelegate(ByVal hwnd As IntPtr, ByVal strText As String, ByVal strCaption As String, ByVal type As Int32) As Int


3  实现调用

   Dim api As New DllImported.CDllImported

    Dim msg As msgDelegate
=  api.GetApi(Gettype(msgDelegate) ,  " user32.dll " " MessageBoxW " )
     msg(IntPtr.Zero, 
" Done " " Change " 0 )

类似的可以在C#内调用,由于类代码是C#写的,调用起来很容易,此略去。
 

你可能感兴趣的:(.net)