C#动态调用非托管DLL(一)

         尝试着在C#下调用以前Delphi写的一些DLL,基本实现动态调用,传入回调函数,及调用带结构数组指针作为参数的函数.

     虽然DllImport可以方便的静态调用DLL的函数,但在.net2.0中新增加了一个Marshal.GetDelegateForFunctionPointer 方法,可以将非托管函数指针转换为委托。 有了这个方法就可以用三个Windows API函数即:LoadlibraryGetProcAddressFreelibrary来实现动态调用DLL了.下面是实现DLL动态调用的静态类

/****************************(如转载,请保留版权信息)************************
 author:awin                                                              
 e-mail:[email protected]                                                   
 blog:  
http://blog.csdn.net/awin                                       
*****************************(如转载,请保留版权信息)***********************
*/



using  System;
using  System.Runtime.InteropServices;

namespace  Awin.Common
{
    
/// 
    
/// DLL加载类
    
/// 

    internal class DllLoader
    
{
        [DllImport(
"Kernel32")]
        
public static extern int GetProcAddress(int handle, String funcname);

        [DllImport(
"Kernel32")]
        
public static extern int LoadLibrary(String funcname);

        [DllImport(
"Kernel32")]
        
public static extern int FreeLibrary(int handle);


        
public static Delegate GetAddress(int dllModule, string functionname, Type t)
        
{
            
int addr = GetProcAddress(dllModule, functionname);
            
if (addr == 0)
                
return null;
            
else
                
return Marshal.GetDelegateForFunctionPointer(new IntPtr(addr), t);
        }

    }

}

使用例子

 

 
private   int  m_hDLL  =   0 // DLL句柄
private   delegate   int  ShowForm(IntPtr aHandle);
private  ShowForm m_ShowForm;
private   const   string  DLLNAEM  =   " XXX.dll " ;

m_hDLL 
=  DllLoader.LoadLibrary(DLLNAEM);
if  (m_hDLL  ==   0 )
{
    MessageBox.Show(
"加载失败!");
    
return;
}

m_ShowForm 
=  (ShowForm) DllLoader.GetAddress(m_hPacsview,  " ShowForm " typeof  (ShowForm));

// 使用ShowForm
  if  (m_ShowForm  !=   null )
                m_ShowForm(iHandle);

// 卸载DLL
 DllLoader.FreeLibrary(m_hDLL); 

下一篇再说说调用带结构数组指针作为参数的函数

你可能感兴趣的:(C#)