c# 如何调用非托管函数
来源:互联网 发布:ipadapp下载不了软件 编辑:程序博客网 时间:2024/06/07 18:50
在目前的项目当中经常需要调用系统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类型
当然,这只是一个最简单的例子,当涉及到数据类型的转换以及函数回调的时候,情况就会复杂多了,这个就姑且做为一个开篇吧。
- c# 如何调用非托管函数
- 如何使用C#调用非托管DLL函数
- C#如何直接调用非托管代码
- C#如何直接调用非托管代码
- C#如何直接调用非托管代码
- C#如何直接调用非托管代码
- 使用C#调用非托管DLL函数
- C#调用非托管DLL函数
- C#调用非托管DLL函数
- C#调用非托管动态库中的函数
- C#调用非托管DLL函数bitblt实现截屏
- c#调用非托管函数的一个方法
- 平台调用:C# 使用非托管dll函数
- C#调用非托管C++DLL中的函数
- C#调用非托管函数参数为Void* 时,方法
- C#调用非托管DLL
- C#调用非托管DLL
- C#调用非托管Dll
- hdu4027(线段树)
- 三种LCA算法(一):Doubly算法(倍增算法)
- @media 媒体查询
- redis学习
- hdu6170-多看几遍之DP&递推&字符串-Two strings
- c# 如何调用非托管函数
- ImportError: No module named 'pip._vendor.retrying'
- JVM参数设置、分析
- jzoj5331 【NOIP2017提高A组模拟8.23】壕游戏
- 测试图片
- Array Nesting 问题及解法
- Sublime Text 3 配置文件详解
- java面试题---请用多线程写死锁
- 关于静态资源压缩技术