C#获取dll中函数地址

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Reflection.Emit;



namespace Tzb
{
    // 参数传递方式枚举 ,ByValue 表示值传递 ,ByRef 表示址传递
    public enum ModePass
    {
        ByValue = 0x0001,
        ByRef = 0x0002
    }
    [DllImport("kernel32.dll")]
    static extern IntPtr LoadLibrary(String lpFileName);

    [DllImport("kernel32.dll")]
    static extern IntPtr GetProcAddress(IntPtr hModule,String lpProcName);

    [DllImport("kernel32"),EntryPoint = "FreeLibrary",SetLastError = true]
    static extern bool FreeLibrary(IntPtr hModule);

    //LoadLibrary 返回函数库模块的句柄
    private IntPtr hModule = IntPtr.Zero;

    //GetProcAddress返回的函数指针
    private IntPtr farProc = IntPtr.Zero;

    public void LoadDll(String lpFileName)
    {
        hModule = LoadLibrary(lpFileName);
        if (hModule == IntPtr.Zero)
        {
            throw(new Exception("没有找到:"+lpFileName));
        }
    }
    public void LoadDll(IntPtr HMODULE)
    {
        if(HMODULE==IntPtr.Zero)
        throw(new Exception("HMODULE 为空 ." ));
        hModule=HMODULE;
    }
    
    //获取函数指针
    public void LoadFun(string lpProcName)
    {
        if(hModule==IntPtr.Zero)
            throw(new Exception(" 函数库模块的句柄为空 , 请确保已进行 LoadDll 操作 !"));

        farProc = GetProcAddress(hModule,lpProcName);

        if(farProc==IntPtr.Zero)
            throw(new Exception(" 没有找到 :"+lpProcName+" 这个函数的入口点 "));
    }

    public void LoadFun(string lpFileName,string lpProcName)
    {
        // 取得函数库模块的句柄
        hModule=LoadLibrary(lpFileName);

        // 若函数库模块的句柄为空,则抛出异常
        if(hModule==IntPtr.Zero)
            throw(new Exception(" 没有找到 :"+lpFileName+"." ));

        // 取得函数指针
        farProc = GetProcAddress(hModule,lpProcName);
        if(farProc==IntPtr.Zero)
            throw(new Exception(" 没有找到 :"+lpProcName+" 这个函数的入口点 "));
    }

    public void UnLoadDll()
    {
        FreeLibrary(hModule);
        hModule=IntPtr.Zero;
        farProc=IntPtr.Zero;
    }

    class LoadingDLL
    {

    }
}

你可能感兴趣的:(C#获取dll中函数地址)