我正在将 byte[]
从 C# 传递到 C++ DLL
在 C++ DLL 中,我需要调用一个接受和读取 istream
对象的函数,我打算从 C# 接收 byte[]
作为 char *
并将其转换为 istream
,
C++ DLL
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);
}
虽然看起来工作正常,但我发现在C++中byte[]
的等效数据类型是unsigned char*
,我想到了更改为 unsigned char*
但 C++ 中的大多数 stream
适用于 char*
而不是 unsigned char*
我想问一下
1) 数据类型char*
和unsigned char*
都是1字节,后面发生了什么?如果我继续将 byte[]
与 char*
一起使用,是否会出现任何潜在问题?
2) 如果出现任何问题,我应该如何使用 unsigned char*
构造 istream
对象?
最佳答案
实际上,char *
和 unsigned char *
类型大小不是 1 个字节,而是 4 个字节,假设我们正在讨论 win32 应用程序:它们是指针,并且无论所指向的数据大小如何,所有指针都具有相同的大小。
当 P/Invoke 机制将“简单值”数组视为函数参数时,它会很乐意将指向数组开头的指针提供给下面的 C 函数。毕竟,它从 DLL 中的信息中真正了解的有关 C 函数的全部信息就是其代码的开始位置。据我所知,参数的数量和类型未编码在符号名称中,因此它信任您提供的信息。这意味着即使您向其提供了一个 int 数组,对 C 函数的实际调用也会起作用,因为压入堆栈的参数大小(指针和 int)匹配函数的 ABI。当然,处理可能是错误的,因为大小不匹配。
另请参阅https://msdn.microsoft.com/en-us/library/75dwhxf7(v=vs.110).aspx了解有关所发生情况的更多详细信息。
处理是 unsigned char
和 char
之间的区别:如果在 C# 大小上,您对 byte
值进行一些数学计算(范围 0-255),将其传递到需要 char
值(-128 到 127)的 C 端
做更多的数学计算,可能会出错。如果它只是将其用作移动数据的一种方式,那就没问题。
关于c# - 将字节数组作为 char* 从 C# 传递到 C++ DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42218144/