在封装华为esdk时一直不成功,终于发现是:
1. 结构体中封装域编码为string时,正常应该是32位长度,但总是少得到1位数,最后改为byte[]封装后正确。需要把byte[]转为string
2. 函数参数const char*在传递域编码时也是出错,需转为intptr后传入Marshal.PtrToStringAnsi。使用后需 FreeHGlobal内存。
3. 结构体中中文封装string正常,若不行的话也可封装为byte[],但转为中文时需要 System.Text.Encoding.GetEncoding("GB2312").GetString(byte[]),SDK中可能是GB2312编码
有点搞不懂的是:只有域编码这个封装会出问题,其他都正常。无论这个域编码是在struct中,还是在函数参数中。
最后发现是由于函数中加了CharSet = CharSet.Unicode造成的,删除这个字符集后就不用ptr了,直接用string就可以了。如下:
[DllImport(dllp + "IVS_SDK.dll", CharSet = CharSet.Unicode]