PInvoke什么意思? Platform Invocation Services
以下两篇文章阐述了在C#中使用Win32API的细节
Visual C#中调用Windows API的要点
http://www.cnblogs.com/showna/articles/869295.html
在 C# 中通过 P-Invoke 调用Win32 DLL
http://msdn.microsoft.com/zh-cn/library/aa686045.aspx
注意,DllImport必须放在类定义中,一个DllImport对应一个API声明
MSDN - Windows API Reference
http://msdn.microsoft.com/en-us/library/aa383749(VS.85).aspx
推荐几个辅助.cs文件和工具
api.cs (C# API)
http://download.csdn.net/source/511344
大量常用Win32 API的C#声明(API函数、结构体和常数声明)
http://www.codefans.net/soft/1880.shtml
API精灵 for C#
http://download.csdn.net/source/644635
API 常量查询器
http://download.csdn.net/source/967181
一个CHM格式的Windows API参考
http://www.netyi.net/Book/ace90888-7659-476f-be89-b22fc0b3919f.htm
推荐使用第一个api.cs,并逐步完善它
在文章结束前找到了一个绝好的站点http://www.pinvoke.net/
pinvoke是一个win32 api for .net wiki 上面有绝大多数api及相关数据结构、常量和枚举的C#和VB.NET定义,还包括了API调用的代码范例,而且pinvoki还提供了一个free的VS插件 PInvoke.net Add-in 通过它可以更方便的在.net开发环境中使用api,唯一的缺撼就是对于api的查询结果中只提供了api声明的定义,相关数据结构、常量和枚举需要单独查询,出得的结果也只是相关的pinvoke.net链接。
当然pinvoke.net也不是完美的,由于定义由网友提交,因此有些定义并不规范,最常见的就是参数类型的定义可能跟MSDN的时常有些出入,这个问题可以参考:
C#中调用Windows API时的数据类型对应关系
http://www.cnblogs.com/madyina/articles/864059.html
建议使用在项目中使用一个单独的cs文件存放所有Win32 API的声明及相关定义
Win32API.cs
以上代码是从api.cs改进而来,将以上代码复制到VS中,查看效果
1、用四个region块,括起数据类型定义struct、常量定义const、枚举定义enum及API声明
2、为简化代码输入,struct、const、enum定义不放入class api中
3、每个region块与中间内容留出一空行,但最内层的region除外
4、为相关const定义增加region块哪#region MAX_ADAPTER,但struct不需要,因为struct定义本身就具有收缩功能
...
可以维护这样一个cs文件,在项目中使用和完善它,项目结束后单独保存出来
以下是一个PInvoke.net中关于GetAdapterInfo调用的范例代码的简化版
通过以上代码可以了解一种生疏了的api调用方式(分配堆-调用-根据返回大小重新分配-再调用)、Marshal的使用、非托管内存到托管内存的转换等操作等
以下是PInvoke.net中关于GetRasEnumEntries调用的范例代码
以上代码说明了变长数组的api调用方式,以及dwSize,cb,entries的使用
最后有一点需要提醒,虽然使用PInvoke可以调用Win32API,但这是需要牺牲一些运行时性能的,所以如果有对应的Managed API的话,还是建议选用Managed API。