Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将字节数组从C#传递到C++;DLL作为字符* 我将字节[] /代码>从C++→c++dll < /p> >在C++ DLL中,我需要调用一个函数,接受和读取 istRAM/对象,我打算从c ^ i接收< 字节[]/COD> >代码> char *,并将其转换为 istRAM但大多数C++代码>流在 char *未代码>未签名CHAR* < /P>_C#_C++_Dll_Pinvoke_Marshalling - Fatal编程技术网

将字节数组从C#传递到C++;DLL作为字符* 我将字节[] /代码>从C++→c++dll < /p> >在C++ DLL中,我需要调用一个函数,接受和读取 istRAM/对象,我打算从c ^ i接收< 字节[]/COD> >代码> char *,并将其转换为 istRAM但大多数C++代码>流在 char *未代码>未签名CHAR* < /P>

将字节数组从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*一起

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*
一起使用,是否存在任何潜在问题


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);
}