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