将字节数组从C#传递到C++;DLL作为字符* 我将字节[] /代码>从C++→c++dll < /p> >在C++ DLL中,我需要调用一个函数,接受和读取 istRAM/对象,我打算从c ^ i接收< 字节[]/COD> >代码> char *,并将其转换为 istRAM但大多数C++代码>流在 char *未代码>未签名CHAR* < /P>
C++动态链接库将字节数组从C#传递到C++;DLL作为字符* 我将字节[] /代码>从C++→c++dll < /p> >在C++ DLL中,我需要调用一个函数,接受和读取 istRAM/对象,我打算从c ^ i接收< 字节[]/COD> >代码> char *,并将其转换为 istRAM但大多数C++代码>流在 char *未代码>未签名CHAR* < /P>,c#,c++,dll,pinvoke,marshalling,C#,C++,Dll,Pinvoke,Marshalling,C++动态链接库 extern "C" _declspec(dllexport) bool CheckData(char* data, int dataLength) C# 虽然看起来很好,但是我发现C++中的等效数据类型是未签名CHAR* C++,我认为改为无符号char */COD>但大多数C++代码>流在 char *未代码>未签名CHAR* < /P> 我想问一下 1) 数据类型char*和unsigned char*都是1字节,后面发生了什么?如果我继续将byte[]与char*一起
extern "C" _declspec(dllexport) bool CheckData(char* data, int dataLength)
C#
<>虽然看起来很好,但是我发现C++中的等效数据类型是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匹配。当然,处理过程可能会出错,因为尺寸不匹配
有关发生的情况的更多详细信息,请参见
处理是无符号字符
和字符
之间的区别所在:如果在C大小上,您对字节
值(范围为0-255)进行了一些计算,则将其传递到C端,其中字符
值应为(-128到127)
再多算一算,可能会出问题。如果它只是把它作为一种移动数据的方式,那么一切都很好。你拥有它就可以了。你知道后面发生了什么吗?我想知道发生了什么事没有发生什么事。实际上有一个reinterp铸造。
[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern bool CheckData(byte[] incoming, int size);
public void Process(byte[] bytes)
{
CheckData(bytes, bytes.Length);
}