在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#就可以取到数据了(并不是所有的非托管函数都适用)
使用片断:
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#就可以取到数据了(并不是所有的非托管函数都适用)
相关文章推荐
- Servlet传送对象给Applet使用
- WCF中使用MSMQ无法传送自定义对象
- 使用Bundle对象在Activity之间传送数据
- 使用.Net Remoting传送Image对象
- Servlet传送对象给Applet使用
- WCF中使用MSMQ无法传送自定义对象
- 使用SAFEARRAY传送对象(入门)
- 使用java反射中的getMethod,invoke方法调用对象方法的实例
- 使用URL传送对象到另一平台
- Servlet传送对象给Applet使用
- Servlet传送对象给Applet使用
- WCF中使用MSMQ无法传送自定义对象
- 使用jackson工具类把对象或集合转为JSON格式
- ostream类的3个输出流对象cout,cerr,clog区别和使用
- 使用stringstream对象实现数据类型之间的转换
- Method之invoke()方法的使用
- JavaSE8基础 Class invoke 使用有参数有返回值的非静态函数
- Git的使用之下载仓库(folk)传送(commit)
- windows - redis内存对象使用
- 使用xStream框架从JavaBean对象转换成XML文档转换成Java对象