将字节数组从C#传递给C ++ DLL作为char *

时间:2017-02-14 04:54:40

标签: c# c++ dll pinvoke marshalling

我将byte[]从C#传递给C ++ DLL

在C ++ DLL中,我需要调用一个接受和读取istream对象的函数,我打算从C#接收byte[]char*并将其转换为{{1} },

C ++ DLL

istream

C#

extern "C" _declspec(dllexport) bool CheckData(char* data, int dataLength)

虽然它似乎工作正常,但我发现C ++中[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)] public static extern bool CheckData(byte[] incoming, int size); public void Process(byte[] bytes) { CheckData(bytes, bytes.Length); } 的等效数据类型为byte[],我想改为unsigned char*,但大多数unsigned char* C ++适用于stream而不是char*

我想问一下

1)数据类型unsigned char*char*都是1字节,后面发生了什么?如果我继续将unsigned char*byte[]一起使用,是否存在任何潜在问题?

2)如果有任何问题,我应该如何使用char*来构建unsigned char*个对象?

1 个答案:

答案 0 :(得分:2)

实际上,char *unsigned char *类型大小不是1个字节,而是4个字节,假设我们讨论的是win32应用程序:那些是指针,所有指针都有相同的大小无论指向的数据大小如何。

当P / Invoke机制将“简单值”数组视为函数参数时,它很乐意将指向数组开头的指针提供给下面的C函数。毕竟,所有它真正从DLL中的信息知道C函数是代码开始的地方。据我所知,参数的数量和类型没有在符号名称中编码,因此它信任您提供的信息。这意味着即使你给它一个int数组,对C函数的实际调用也会起作用,因为在栈上推送的参数的大小(指针和int)与ABI的ABI相匹配。功能。当然,处理可能是错误的,因为尺寸不匹配。

另请参阅https://msdn.microsoft.com/en-us/library/75dwhxf7(v=vs.110).aspx了解更多详情。

处理是unsigned charchar之间的差异所在:如果在C#大小上你对byte值(范围0-255)进行一些数学计算,则将其传递给C侧预期char值(-128到127) 要做更多的数学运算,可能会出错。如果它只是将它用作移动数据的一种方式,那就没关系了。