关于动态调用Dll的方法

前段时间做了一个项目,其中要求调用一个VC6开发的Dll文件,而该文件有多个不同的版本,所以要支持动态调用,并支持卸载。

在收集了一些这方面的资料后,编写了下面的类,该类可以方便的调用各种类型的dll,而且简单实用。

view plaincopy to clipboardprint?
using System;  
using System.Collections.Generic;  
using System.Text;  
using System.Runtime.InteropServices;  
 
namespace testdll  
{  
    /// <summary>  
    ///   
    /// </summary>  
    class InvokeDll  
    { 
        #region Win API  
        [DllImport("kernel32.dll")]  
        private extern static IntPtr LoadLibrary(string path);  
 
        [DllImport("kernel32.dll")]  
        private extern static IntPtr GetProcAddress(IntPtr lib, string funcName);  
 
        [DllImport("kernel32.dll")]  
        private extern static bool FreeLibrary(IntPtr lib); 
        #endregion  
 
        private IntPtr hLib;  
        public InvokeDll(String DLLPath)  
        {  
            hLib = LoadLibrary(DLLPath);  
        }  
 
        ~InvokeDll()  
        {  
            FreeLibrary(hLib);              
        }  
 
        //将要执行的函数转换为委托  
        public Delegate Invoke (string APIName,Type t)    
        {  
            IntPtr api = GetProcAddress(hLib, APIName);  
            if (api == IntPtr.Zero)  
                return null;  
            else 
                return Marshal.GetDelegateForFunctionPointer(api, t);  
        }  
}  
 
    } 
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace testdll
{
    /// <summary>
    ///
    /// </summary>
    class InvokeDll
    {
        #region Win API
        [DllImport("kernel32.dll")]
        private extern static IntPtr LoadLibrary(string path);

        [DllImport("kernel32.dll")]
        private extern static IntPtr GetProcAddress(IntPtr lib, string funcName);

        [DllImport("kernel32.dll")]
        private extern static bool FreeLibrary(IntPtr lib);
        #endregion

        private IntPtr hLib;
        public InvokeDll(String DLLPath)
        {
            hLib = LoadLibrary(DLLPath);
        }

        ~InvokeDll()
        {
            FreeLibrary(hLib);           
        }

        //将要执行的函数转换为委托
        public Delegate Invoke (string APIName,Type t) 
        {
            IntPtr api = GetProcAddress(hLib, APIName);
            if (api == IntPtr.Zero)
                return null;
            else
                return Marshal.GetDelegateForFunctionPointer(api, t);
        }
}

    }

使用时,先根据dll中的命令写出相关的代理

public delegate int MsgBox(int hwnd,string msg,string cpp,int ok);
public delegate int DeleteFile(string msg);

然后按下面的代码做就可以了。

view plaincopy to clipboardprint?
InvokeDll dll = new InvokeDll("user32.dll");  
MsgBox mymsg = (MsgBox)dll.Invoke("MessageBoxA", typeof(MsgBox));  
mymsg(this.Handle.ToInt32(), "txtmsg", "titleText", 64);  
 
 
InvokeDll dll1 = new InvokeDll("kernel32.dll");  
DeleteFile df= (DeleteFile)dll1.Invoke("DeleteFileA", typeof(DeleteFile));  
df(deletedfilename); 

 

转:http://blog.csdn.net/null1/archive/2009/03/03/3953155.aspx

posted @   94cool  阅读(200)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
< 2009年8月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示