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

标签 c# c++ dll pinvoke marshalling

我正在将 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 charchar 之间的区别:如果在 C# 大小上,您对 byte 值进行一些数学计算(范围 0-255),将其传递到需要 char 值(-128 到 127)的 C 端 做更多的数学计算,可能会出错。如果它只是将其用作移动数据的一种方式,那就没问题。

关于c# - 将字节数组作为 char* 从 C# 传递到 C++ DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42218144/

相关文章:

c# - 模型状态错误 : The value 'null' is not valid for nullable field

c# - 文件流和编码

c++ - C++ 中的浮点加法是否可能发生下溢?

c++ - 从列表映射中检索问题

c# - 调试 com 可见 dll 托管代码

c# - 从模型中获取特定的十进制长度

c# - 如何使用 Linq 按日期对订单列表进行分组

visual-c++ - 从 DLL 导出 MFC 对话框

c++ - 以十六进制表示位串的最佳实践(Arduino)

c# - 在iis中启用svg解压