Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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++;通过IntPtr将阵列连接到c# 考虑以下设置:C++应用程序C++库。C元素通过回调从C++中填充。c端回调的定义如下: void callbackTester(IntPtr pData, UInt32 length) { int[] data = new int[length]; Marshal.Copy(pData, data, (int)0, (int)length); //using data.. on c# } typedef void (__stdcall *func)(uint8_t* pdata, uint32_t length); void onData() { std::vector<uint8_t> dataToCallback; // fill in dataToCallback _callback(&(dataToCallback[0]), dataToCallback.size()); // where _callback is a pointer to that c# function } 现在,C++侧回调定义如下: void callbackTester(IntPtr pData, UInt32 length) { int[] data = new int[length]; Marshal.Copy(pData, data, (int)0, (int)length); //using data.. on c# } typedef void (__stdcall *func)(uint8_t* pdata, uint32_t length); void onData() { std::vector<uint8_t> dataToCallback; // fill in dataToCallback _callback(&(dataToCallback[0]), dataToCallback.size()); // where _callback is a pointer to that c# function } 和C++使用这样的回调: void callbackTester(IntPtr pData, UInt32 length) { int[] data = new int[length]; Marshal.Copy(pData, data, (int)0, (int)length); //using data.. on c# } typedef void (__stdcall *func)(uint8_t* pdata, uint32_t length); void onData() { std::vector<uint8_t> dataToCallback; // fill in dataToCallback _callback(&(dataToCallback[0]), dataToCallback.size()); // where _callback is a pointer to that c# function } void onData() { std::向量数据回调; //将数据填入回调 _回调(&(dataToCallback[0]),dataToCallback.size(); //其中_callback是指向该c#函数的指针 } 我的任务:用回调从C++一侧获取数组,< /P> 这样,当C++对象调用OnDATA()函数时,它调用C语言中的回调函数。到现在为止,一直都还不错。我做了一个C++测试程序,它使用这个,并且我在回调端正确接收数组。如果我在c#tester上使用它,我会收到垃圾 例如:如果我发送ut8*t数组{ 1, 1 },我得到C++测试者的{ 1, 1 },而我在C边得到{0xFEIEABAB,0xFIEEEFEE }…显然,UIT8*T*C++指针和ItPtR C的转换与我预期的不一样。_C#_C++_Pinvoke_Marshalling - Fatal编程技术网

如何封送c++;通过IntPtr将阵列连接到c# 考虑以下设置:C++应用程序C++库。C元素通过回调从C++中填充。c端回调的定义如下: void callbackTester(IntPtr pData, UInt32 length) { int[] data = new int[length]; Marshal.Copy(pData, data, (int)0, (int)length); //using data.. on c# } typedef void (__stdcall *func)(uint8_t* pdata, uint32_t length); void onData() { std::vector<uint8_t> dataToCallback; // fill in dataToCallback _callback(&(dataToCallback[0]), dataToCallback.size()); // where _callback is a pointer to that c# function } 现在,C++侧回调定义如下: void callbackTester(IntPtr pData, UInt32 length) { int[] data = new int[length]; Marshal.Copy(pData, data, (int)0, (int)length); //using data.. on c# } typedef void (__stdcall *func)(uint8_t* pdata, uint32_t length); void onData() { std::vector<uint8_t> dataToCallback; // fill in dataToCallback _callback(&(dataToCallback[0]), dataToCallback.size()); // where _callback is a pointer to that c# function } 和C++使用这样的回调: void callbackTester(IntPtr pData, UInt32 length) { int[] data = new int[length]; Marshal.Copy(pData, data, (int)0, (int)length); //using data.. on c# } typedef void (__stdcall *func)(uint8_t* pdata, uint32_t length); void onData() { std::vector<uint8_t> dataToCallback; // fill in dataToCallback _callback(&(dataToCallback[0]), dataToCallback.size()); // where _callback is a pointer to that c# function } void onData() { std::向量数据回调; //将数据填入回调 _回调(&(dataToCallback[0]),dataToCallback.size(); //其中_callback是指向该c#函数的指针 } 我的任务:用回调从C++一侧获取数组,< /P> 这样,当C++对象调用OnDATA()函数时,它调用C语言中的回调函数。到现在为止,一直都还不错。我做了一个C++测试程序,它使用这个,并且我在回调端正确接收数组。如果我在c#tester上使用它,我会收到垃圾 例如:如果我发送ut8*t数组{ 1, 1 },我得到C++测试者的{ 1, 1 },而我在C边得到{0xFEIEABAB,0xFIEEEFEE }…显然,UIT8*T*C++指针和ItPtR C的转换与我预期的不一样。

如何封送c++;通过IntPtr将阵列连接到c# 考虑以下设置:C++应用程序C++库。C元素通过回调从C++中填充。c端回调的定义如下: void callbackTester(IntPtr pData, UInt32 length) { int[] data = new int[length]; Marshal.Copy(pData, data, (int)0, (int)length); //using data.. on c# } typedef void (__stdcall *func)(uint8_t* pdata, uint32_t length); void onData() { std::vector<uint8_t> dataToCallback; // fill in dataToCallback _callback(&(dataToCallback[0]), dataToCallback.size()); // where _callback is a pointer to that c# function } 现在,C++侧回调定义如下: void callbackTester(IntPtr pData, UInt32 length) { int[] data = new int[length]; Marshal.Copy(pData, data, (int)0, (int)length); //using data.. on c# } typedef void (__stdcall *func)(uint8_t* pdata, uint32_t length); void onData() { std::vector<uint8_t> dataToCallback; // fill in dataToCallback _callback(&(dataToCallback[0]), dataToCallback.size()); // where _callback is a pointer to that c# function } 和C++使用这样的回调: void callbackTester(IntPtr pData, UInt32 length) { int[] data = new int[length]; Marshal.Copy(pData, data, (int)0, (int)length); //using data.. on c# } typedef void (__stdcall *func)(uint8_t* pdata, uint32_t length); void onData() { std::vector<uint8_t> dataToCallback; // fill in dataToCallback _callback(&(dataToCallback[0]), dataToCallback.size()); // where _callback is a pointer to that c# function } void onData() { std::向量数据回调; //将数据填入回调 _回调(&(dataToCallback[0]),dataToCallback.size(); //其中_callback是指向该c#函数的指针 } 我的任务:用回调从C++一侧获取数组,< /P> 这样,当C++对象调用OnDATA()函数时,它调用C语言中的回调函数。到现在为止,一直都还不错。我做了一个C++测试程序,它使用这个,并且我在回调端正确接收数组。如果我在c#tester上使用它,我会收到垃圾 例如:如果我发送ut8*t数组{ 1, 1 },我得到C++测试者的{ 1, 1 },而我在C边得到{0xFEIEABAB,0xFIEEEFEE }…显然,UIT8*T*C++指针和ItPtR C的转换与我预期的不一样。,c#,c++,pinvoke,marshalling,C#,C++,Pinvoke,Marshalling,有什么建议吗?非常感谢。 检查一件事是,在C端,你期望每个元素有4个字节(“int []数据”),但是C++上,你只分配每个元素UINT8-1字节。 调整分配或长度使用,您可能会遇到访问冲突,这就是为什么您会看到魔法字节[1] (1) < P>问题似乎是C++ UINT8YT是一个无符号字节,而C++ INT/COD>是一个带符号的4字节整数。所以你有一个简单的类型不匹配。与uint8\t匹配的C类型是byte 您的回拨应该是: void callbackTester(IntPtr pData

有什么建议吗?非常感谢。

检查一件事是,在C端,你期望每个元素有4个字节(“int []数据”),但是C++上,你只分配每个元素UINT8-1字节。 调整分配或长度使用,您可能会遇到访问冲突,这就是为什么您会看到魔法字节[1]


(1)

< P>问题似乎是C++<代码> UINT8YT是一个无符号字节,而C++ <代码> INT/COD>是一个带符号的4字节整数。所以你有一个简单的类型不匹配。与
uint8\t
匹配的C类型是
byte

您的回拨应该是:

void callbackTester(IntPtr pData, uint length)
{
    byte[] data = new byte[length];
    Marshal.Copy(pData, data, 0, (int)length);
}

据我所知(C#)int。正确的应该是byte。另外,std::vector不是数组,我怀疑你能否像那样将它复制到C#。@floele你在哪里是对的,哪里是错的。智力=uint8_t,int是一个32的整数<代码>字节[]在C#中可以工作。std::vector的底层数据结构是一个数组,因此它可以正常工作。protip:使用std::vector.data而不是&(dataToCallback[0])。uint8_t被“强制”到IntPtr而不是uintpttr,因为Marshal.Copy只接受IntPtr。在C语言中,你还能得到什么数据?在C语言中,@ ETWAS77 ItPtR是一个误称,它实际上是与C++ <代码> VUL*等价的。这只是一个内存位置。首先,你想做的是通过C++函数的函数指针调用C++中的C函数,不知道你的意思。我在C++端提供适当的数据(我在调试器中看到)。当我到达c端(仍然在调试器上)并使用IntPtr和length初始化那个里的数组时,我得到了那个东西。长度传输正常。显然,IntPtr指向的地址不正确。。怎么了?请检查此示例: