您的位置:首页 > 其它

在P/Invoke中使用GCHandle传送对象

2010-07-13 20:45 239 查看
在C#中调用非托管函数的时,有很多函数需要使用在C#中定义对象的地址;因此要使用到GCHandle类。

使用片断:

DWORD ReadCert(
UNT_DEV_HANDLE hDev,
BYTE* pbCert,
DWORD* pdwCertLen,
DWORD dwFlag);

/// Return Type: DWORD->unsigned int
///hDev: UNT_DEV_HANDLE->void*
///pbCert: BYTE*
///pdwCertLen: DWORD*
///dwFlag: DWORD->unsigned int
[System.Runtime.InteropServices.DllImportAttribute("GAKeyPub", EntryPoint = "ReadCert")]
public static extern int ReadCert(System.IntPtr hDev, [Out] IntPtr pbCert, ref int pdwCertLen, int dwFlag);

byte[] certBytes = new byte[certLen];
GCHandle hcertBytes = GCHandle.Alloc(certBytes, GCHandleType.Pinned);
IntPtr pcert = hcertBytes.AddrOfPinnedObject();
result = GAKeyPubInvoke.ReadCert(devHandle, pcert, ref certLen, 1);

这样C#就可以取到数据了(并不是所有的非托管函数都适用)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: