我需要从c++传递一个数组到c#
c++头文件如下
extern "C" GMSH_API void GMSH_Model_OCC_Fragments(int* arrayPtr);
c++的cpp如下
void GMSH_Model_OCC_Fragments(int* arrayPtr)
{
int array[] = {1,2};
arrayPtr = array;
}
c#代码如下
[DllImport("GMSHCSHARP.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void GMSH_Model_OCC_Fragments(out IntPtr arrayPtr);
public void Create()
{
GMSH_Model_OCC_Fragments(out IntPtr arrayPtr);
int[] ReturnArray = new int[2];
int size = Marshal.SizeOf(ReturnArray[0]) * ReturnArray.Length;
Marshal.Copy(arrayPtr, ReturnArray, 0, size);
}
似乎arrayPtr传播作为null,这使元帅。复制返回错误。
我很感激你的帮助。
当你从c#调用c++时,你必须遵守c++的规则,所以你不能通过
给数组赋值arrayPtr = array;
你可以填充c#给出的数组
c++函数void someFunction(char* dest, size_t length){
char* someData = "helloWorld";
size_t copyLen = std::min(length, strlen(someData));
memcpy(dest, someData, copyLen);
//If it was a string you'd also want to make sure it's null terminated
}
c#函数调用(类似于这样抱歉如果不是100%)
[DllImport("MyDll.dll", CallingConvention = CallingConvention.CDecl)]
private static extern void someFunction(Byte[] dest, uint Length);
Byte[] array = new byte[10];
someFunction(array, 10);
我不确定你是否可以通过堆内存的c++,但如果你可以,你会这样做:
void GMSH_Model_OCC_Fragments(int** dest){
*dest = new int[2];
*dest[0] = 1;
*dest[1] = 2;
}
注意,您需要使用双指针以这种方式传递内存。因为你需要第一个指针来引用对象或数组,第二个指针来跟踪对象或数组。