C#访问非托管DLL
来至:http://bbs.mini188.com/showtopic-161.aspx
前段时间写了一个读卡器程序,使用到了一个DLL。在.NET 中调用DLL还是相当简单的。我也是转别人的代码,自己的不写。下面就是代码:
C#中要使用动态链接库中的导出函数,只能在程序中根据DllAtribute显示调用,无法在运行阶段动态加载,但是我们可以利用WIN32 API的LoadLibrary和FreeLibrary打到目的,问题是根据GetProcAddress()函数获取到的导出函数的地址无法在C#中利用,网上很多方法多是利用对函数调用栈的操作来达到在C#中操作的目的. 其实如果导出函数没有返回值,完全可以利用另一个API函数达到动态绑定DLL库的目的:
LRESULT CallWindowProc( WNDPROC lpPrevWndFunc,
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
如果导出函数无形参也无返回值的话,可以直接调用CallWindowProc(FunctionName,0,0,0,0),如果我们需要向导出函数传递简单参数的话,也可以自定义一个消息,用消息封装实参。
[DllImport("kernel32")]
public extern static int LoadLibrary(string lpLibFileName);
[DllImport("kernel32")]
public extern static bool FreeLibrary(int hLibModule);
[DllImport("kernel32", CharSet=CharSet.Ansi)]
public extern static int GetProcAddress(int hModule, string lpProcName);
[DllImport("user32", EntryPoint="CallWindowProc")]
public static extern int CallWindowProc(int lpPrevWndFunc, int hwnd, int MSG, int wParam, int lParam);

private void button1_Click(object sender, System.EventArgs e)
{
int hmod=LoadLibrary("*****.dll");
int pFname=GetProcAddress(hmod, "*****");
CallWindowProc(pFname,0,0,0);
FreeLibrary(hmod);
}
前段时间写了一个读卡器程序,使用到了一个DLL。在.NET 中调用DLL还是相当简单的。我也是转别人的代码,自己的不写。下面就是代码:
C#中要使用动态链接库中的导出函数,只能在程序中根据DllAtribute显示调用,无法在运行阶段动态加载,但是我们可以利用WIN32 API的LoadLibrary和FreeLibrary打到目的,问题是根据GetProcAddress()函数获取到的导出函数的地址无法在C#中利用,网上很多方法多是利用对函数调用栈的操作来达到在C#中操作的目的. 其实如果导出函数没有返回值,完全可以利用另一个API函数达到动态绑定DLL库的目的:






如果导出函数无形参也无返回值的话,可以直接调用CallWindowProc(FunctionName,0,0,0,0),如果我们需要向导出函数传递简单参数的话,也可以自定义一个消息,用消息封装实参。
















注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错请点击下右下角的推荐,非常感谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人