Welcome

首页 / 软件开发 / .NET编程技术 / .NET Compact Framework下Win32 API P/Invoke的使用

.NET Compact Framework下Win32 API P/Invoke的使用2011-12-21 博客园 Jake Lin由于CF是一个精简(Compact)的.NET Framework,因此在开发CF应用时有一部分功能MS并没有在CF中实现,需要直接调用Win32的API来实现。由于Win32的API是面向native代码的,一般会提供一个DLL库以及相应header文件。使用C++是十分容易和简单调用这些API,但是使用C# .NET就没那么幸运了。C#调用Win32的API往往要借助于P/Invoke的帮助,下面讲述一下P/Invoke 的使用。

API的引入

调用Win32的API需要引入相应的DLL,Wince下大部分的API存在于coredll.dll里面,同时DllImport不仅仅支持Win32 API,他可以支持任何native 的DLL的引入。

[DllImport("coredll.dll", CharSet = CharSet.Auto)]
错误情况处理

调用Win32的API一般通过返回值表示调用结果,推荐使用Exception代替返回值的方式表达错误和异常情况。

int lStatus = RasHangUp(rasSession);
if (lStatus != 0)
{
throw new ApplicationException("RasHangUp(" + rasSession + ") failed with error code: " + lStatus);
}
参数的转换

调用Win32的API大部分工作就是在对调用参数进行类型转换,这些参数基于.NET的角度叫做unmanaged type(native type),对应于.NET built-in 的managed type.例如调用查询所有WiFi网卡信息的接口,入口参数为LPWSTR和PINTFS_KEY_TABLE,LPWSTR是字符串指针( Long Pointer to Wide String),而PINTFS_KEY_TABLE是一个结构体。

DWORD WZCEnumInterfaces(
LPWSTR pSrvAddr,
PINTFS_KEY_TABLE pIntfs
);
typedef struct{DWORD dwNumIntfs;PINTF_KEY_ENTRY pIntfs;} INTFS_KEY_TABLE, *PINTFS_KEY_TABLE;