在我的 C++ 本机插件中,我有一个调用
vector<unsigned char> getCPPOutput() {
return some_vector;
}
在我的 C# 方面,我有电话
[DllImport("MySharedObj")]
static extern byte[] getCPPOutput();
由于某种原因,尽管我这两个调用之间不匹配,即如果在我的 C++ 中我检查作为输出得到的数组的大小:16777216
(针对我的具体情况)。
当我检查字节数组的大小时,我得到:170409961
C# 上的调用非常简单,类似于:
byte[] outputBuffer = getCPPOutput();
没有任何预分配。在调用该函数之前我需要做些什么吗?
我根本不是 C# 专家,可能我错过了一些非常愚蠢的东西。
您的返回类型是byte[]
在 C# 中但是vector<unsigned char>
在C++中。这些不匹配。在您的其他问题中,我们鼓励您填充数组而不是返回它,但您仍然想返回一个数组,这是如何做到的:
转换Vector
到数组然后返回它。 C++ 返回类型应该是char*
C# 返回类型应该是IntPtr
。另外,您需要一种方法来告诉 C# 数组的大小。您可以通过论证来做到这一点。在 C# 方面,您必须使用该参数返回的大小再次创建新数组。之后,使用Marshal.Copy
从中复制数据IntPtr
到那个新数组。
C++:
char* getCPPOutput(int* outValue)
{
//Convert the Vector to array
char* vArrray = &some_vector[0];
*outValue = some_vector.size();
return vArrray;
}
C#:
[DllImport("MySharedObj", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr getCPPOutput(out int outValue);
//Test
void Start()
{
int size = 0;
//Call and return the pointer
IntPtr returnedPtr = getCPPOutput(out size);
//Create new Variable to Store the result
byte[] returnedResult = new byte[size];
//Copy from result pointer to the C# variable
Marshal.Copy(returnedPtr, returnedResult, 0, size);
//The returned value is saved in the returnedResult variable
}
请注意您的 C++ 代码:
我没有看到你的some_vector
变量声明。如果在该函数中将其声明为局部变量,那么它位于堆栈上,并且您必须使用动态分配新数组new
关键字并创建另一个函数来释放它delete
在 C# 端收到后的关键字。除非将数组声明为static
对象或动态分配new
关键词。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)