在我的C ++原生插件中,我有一个电话
vector<unsigned char> getCPPOutput() {
return some_vector;
}
在我的C#方面,我接到了电话
[DllImport("MySharedObj")]
static extern byte[] getCPPOutput();
出于某种原因,虽然我在这两个调用之间存在不匹配,即如果在我的C ++中我检查数组的大小,我得到输出:16777216
(对于我的具体情况)。
当我检查字节数组的大小时,我得到:170409961
对C#的调用非常简单,它类似于:
byte[] outputBuffer = getCPPOutput();
没有任何预分配。在调用函数之前有什么我需要的吗?
我根本不是C#专家,可能是我错过了一些非常愚蠢的东西。
答案 0 :(得分:1)
您的返回类型在C#中为byte[]
,在C ++中为vector<unsigned char>
。这些不匹配。在你的其他问题中,我们鼓励你填充数组而不是返回它但是你仍然想要返回一个数组,这是怎么做的:
将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
关键字动态分配。