[转帖]C#如何调用非托管函数(一)
[转帖]C#如何调用非托管函数(一)
在目前的项目当中经常需要调用系统API,或者第三方的API,而这些API通常都不是基于.NET的,也就是所说的非托管函数,还好.NET为我们提供了平台调用服务,通过这个服务,就可以轻松的实现我们的需求。 调用过程其实比较简单,主要分以下几个步骤: 1) 找到函数的定义以及他所在的链接库(DLL文件) 以系统提供的BEEP函数为例(用指定的频率和时间发出蜂鸣声),他就是在动态链接库kernel32.dll中定义的。 在MSDN上可以找到他的函数签名为 BOOL Beep(DWORD dwFreq,DWORD dwDuration),可以看出该函数应该接受两个无符号的整数作为参数,第一个为频率,第二个为持续时间,并返回一个bool值。 2)在托管代码中创建函数原型 知道了函数的位置和签名,就可以为他编写托管定义了。看下面的代码 using System.Runtime.InteropServices;
[DllImport("kernel32.dll")] static extern bool Beep(uint dwFreq, uint dwDuration);
[DllImport("kernel32.dll", EntryPoint = "Beep")]
static extern bool Beep2(uint dwFreq, uint dwDuration); EntryPoint就指明了原来函数的名称。 3)调用 自此我们就可以像使用托管代码一样调用该函数了 ,下面是完整的代码 using System.Runtime.InteropServices;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { for (uint i = 100; i <= 20000; i++) { Beep(i, 5); } } [DllImport("kernel32.dll")] static extern bool Beep(uint dwFreq, uint dwDuration); } }
当然,这只是一个最简单的例子,当涉及到数据类型的转换以及函数回调的时候,情况就会复杂多了,这个就姑且做为一个开篇吧。 本文转自刘武作品 想查看系统API的定义,可参考MSDN Win32 and COM Development 想知道更多的API调用方法,请参考P/INVOKE 关于DllImport属性的更多说明,请参考MSDN 扫一扫加作者微信
参考文档:
C#-C/S框架如何新建一个模块和业务窗体? 看你把程序分了好几个模块,不知道如何调用? C# 如何设计一个标准的等待窗体 C#调用Delphi编译的DLL函数库返回大文本数据 Delphi程序调用C#.Net编译的DLL并打开窗体(详解) C# 控件的属性是个类,如何给添加自定义属性 控件的属性是个类,如何给添加自定义属性(C#) C# 动态编译及调用WebService的方法 [转帖]C#如何调用非托管函数(二)-传递结构和类 [转帖]C#如何调用非托管函数(三)-实现回调函数 [转帖]C#如何实现DataGridView到DataGridView的拖拽 C#调用C++编译的DLL详解 [转帖]C# const和static readonly有什么区别? C# WebService异步处理/异步调用详解 C#用HOOK函数自动关闭IE广告窗口
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |