博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# 如何调用非托管函数 (转)
阅读量:4678 次
发布时间:2019-06-09

本文共 1361 字,大约阅读时间需要 4 分钟。

在目前的项目当中经常需要调用系统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);

首先引用了命名空间System.Runtime.InteropServices,他包含了所有平台调用必须的类,然后使用DllImport属性告诉编译器该函数的定义在kernel32.dll链接库中,由于该链接库位于system32目录中,因此我们不需要指定绝对路径。注意这里必须使用 static和extern修饰符,以声明该函数是外部实现的,同时函数的签名也应该和原来的保持一致。当然,我们也可以修改函数的名称,此时就必须指定入口点,如:

[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); } }

注:也可以把Beep函数放在一个单独的类里面,不过要声明为Public类型

当然,这只是一个最简单的例子,当涉及到数据类型的转换以及函数回调的时候,情况就会复杂多了,这个就姑且做为一个开篇吧。

附:

想查看系统API的定义,可参考

想知道更多的API调用方法,请参考

关于DllImport属性的更多说明,请参考

转载于:https://www.cnblogs.com/shanfeng/p/4394648.html

你可能感兴趣的文章
网页宽高clientWidth clientHeight获得数值不对的问题
查看>>
AX向在线用户发送消息
查看>>
程序员八荣八耻
查看>>
OCR引擎-Tesseract
查看>>
datagrid单元格格式化样式化
查看>>
转:在Nginx上配置多个站点
查看>>
javascript 技巧总结积累1-108条(正在积累中)
查看>>
为什么尽量避免使用 CSS 表达式
查看>>
[转]这才是真正的3D显示!Leap Motion推出次毫米级3D手动控制技术,让人手和影像融为一体...
查看>>
poj 3621 Sightseeing Cows 01分数规划
查看>>
bzoj 2821:作诗 分块
查看>>
如何让eclipse恢复默认布局
查看>>
简析.NET Core 以及与 .NET Framework的关系
查看>>
【模板题】欧拉回路
查看>>
QEMU+GDB调试方法
查看>>
洛谷 P1272 重建道路(树形DP)
查看>>
sql
查看>>
ShellExecute与ShellExecuteEx的用法
查看>>
第16课 “远程 Git文档库” 的基础操作
查看>>
总结oninput、onchange与onpropertychange事件的使用方法和差别
查看>>