Unity,c ++本机插件不匹配的字节数组

时间:2018-04-26 15:06:33

标签: c# c++ unity3d

在我的C ++原生插件中,我有一个电话

vector<unsigned char> getCPPOutput() {
    return some_vector;
}

在我的C#方面,我接到了电话

[DllImport("MySharedObj")]
static extern byte[] getCPPOutput();

出于某种原因,虽然我在这两个调用之间存在不匹配,即如果在我的C ++中我检查数组的大小,我得到输出:16777216(对于我的具体情况)。

当我检查字节数组的大小时,我得到:170409961

对C#的调用非常简单,它类似于:

byte[] outputBuffer = getCPPOutput();

没有任何预分配。在调用函数之前有什么我需要的吗?

我根本不是C#专家,可能是我错过了一些非常愚蠢的东西。

1 个答案:

答案 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关键字动态分配。