您的位置:首页 > 其它

封送带字符串指针的结构体参数到非托管函数

2013-05-08 23:02 225 查看
在NET项目开发过程中,经常会遇到向非托管代码封送结构体的情况,如果结构体中仅包含blittable类型/字符串/字符数组类型字段,仅需要在C#中重新声明该结构体并将该结构体作为参数传递到非托管函数即可。但若结构体中包含了指向字符串的指针,情况会稍微复杂些。

非托管结构体代码如下:

?
?
C#中以string代表wchar_t*,如非托管函数参数直接为wchar_t**,可以用ref string或out string表示指向字符串的指针。但上述示例wchar_t**存在于结构体中,对于这类指针在C#中采用IntPtr。

?
下面需要获取字符串数组的首地址,C#中有两种方式可以获取数组的首地址:GCHandle的AddrOfPinnedObject和Marshal.UnsafeAddrOfPinnedArrayElement方法。但GCHandle无法Pinned引用类型数组,MSDN中又指明Marshal.UnsafeAddrOfPinnedArrayElement方法调用前需Pinned指定的数组。看来必须设法将字符串数组转换为值类型数组,完整代码如下:

?
?
运行结果:





转载请注明出处:

http://www.cnblogs.com/desmondwang/archive/2011/12/18/MarshalStructWithStrPtr.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐