1.打开项目“Tzb”,打开类视图,右击“Tzb”,选择“添加”--“类”,类名设置为“dld”,即dynamic loading dll 的每个单词的开头字母;
2.添加所需的命名空间及声明参数传递方式枚举:
using System.Runtime.InteropServices; // 用 DllImport 需用此 命名空间
using System.Reflection; // 使用 Assembly 类需用此 命名空间
using System.Reflection.Emit; // 使用 ILGenerator 需用此 命名空间
在“public class dld”上面添加如下代码声明参数传递方式枚举:
/// summary
/// 参数传递方式枚举 ,ByValue 表示值传递 ,ByRef 表示址传递
/// /summary
public enum ModePass
{
ByValue = https://www.04ip.com/post/0x0001,
ByRef = 0x0002
}
3.声明LoadLibrary、GetProcAddress、FreeLibrary及私有变量hModule和farProc:
/// summary
/// 原型是 :HMODULE LoadLibrary(LPCTSTR lpFileName);
/// /summary
/// param name="lpFileName"DLL 文件名 /param
/// returns 函数库模块的句柄 /returns
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string lpFileName);
/// summary
/// 原型是 : FARPROC GetProcAddress(HMODULE hModule, LPCWSTR lpProcName);
/// /summary
/// param name="hModule" 包含需调用函数的函数库模块的句柄 /param
/// param name="lpProcName" 调用函数的名称 /param
/// returns 函数指针 /returns
[DllImport("kernel32.dll")]
static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
/// summary
/// 原型是 : BOOL FreeLibrary(HMODULE hModule);
/// /summary
/// param name="hModule" 需释放的函数库模块的句柄 /param
/// returns 是否已释放指定的 Dll/returns
[DllImport("kernel32",EntryPoint="FreeLibrary",SetLastError=true)]
static extern bool FreeLibrary(IntPtr hModule);
/// summary
/// Loadlibrary 返回的函数库模块的句柄
/// /summary
private IntPtr hModule=IntPtr.Zero;
/// summary
/// GetProcAddress 返回的函数指针
/// /summary
private IntPtr farProc=IntPtr.Zero;
4.添加LoadDll方法 , 并为了调用时方便,重载了这个方法:
/// summary
/// 装载 Dll
/// /summary
/// param name="lpFileName"DLL 文件名 /param
public void LoadDll(string lpFileName)
{
hModule=LoadLibrary(lpFileName);
if(hModule==IntPtr.Zero)
throw(new Exception(" 没有找到 :"+lpFileName+"." ));
}
若已有已装载Dll的句柄,可以使用LoadDll方法的第二个版本:
public void LoadDll(IntPtr HMODULE)
{
if(HMODULE==IntPtr.Zero)
throw(new Exception(" 所传入的函数库模块的句柄 HMODULE 为空 ." ));
hModule=HMODULE;
}
5.添加LoadFun方法,并为了调用时方便,也重载了这个方法,方法的具体代码及注释如下:
/// summary
/// 获得函数指针
/// /summary
/// param name="lpProcName" 调用函数的名称 /param
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+" 这个函数的入口点 "));
}
/// summary
/// 获得函数指针
/// /summary
/// param name="lpFileName" 包含需调用函数的 DLL 文件名 /param
/// param name="lpProcName" 调用函数的名称 /param
public void LoadFun(string lpFileName,string lpProcName)
{ // 取得函数库模块的句柄
hModule=LoadLibrary(lpFileName);
推荐阅读
- 微信直播怎么设置观众隐私,看微信直播怎么隐藏自己的名字
- 财务转做erp系统运维,erp财务顾问转行
- 明德公益公众号关注,明德公益研究中心
- 葫芦侠恋爱养成类游戏下载,葫芦侠官方正版
- linux自动排版命令 linux排序命令
- saprfc接口,sap接口方式idoc
- 微信小程序资质主体,小程序资质主体不一致
- 直播的值可以组什么,直播的播可以组什么词语
- python字典中放函数 python字典作为函数参数