C#如何向C++生成的dll文件中傳遞二維數組?
小弟想要用Unity調用DlibC++的識別演算法,生成Dlib的動態鏈接庫文件後遇到了將像素點陣傳入庫的問題,google後發現可以用IntPtr傳遞一些複雜的(如數組)的地址給dll,於是用以下代碼進行了測試:
C++:
//頭文件dllTest.h
extern "C" _declspec(dllexport) int arraytest1(int **a);
//函數
int arraytest1(int **a)
{
return a[0][1];
}
C#
using UnityEngine;
using System;
using System.IO;
using System.Collections;
using System.Runtime.InteropServices;
public class NewBehaviourScript : MonoBehaviour {
int[,] array=new int[2,2]{
{1,2},
{3,4}
};
[DllImport ("DLLTest")]
public static extern int arraytest1(IntPtr array);
void Start() {
GCHandle dllfind;dllfind = GCHandle.Alloc(array, GCHandleType.Pinned);
Debug.Log("dlltest="+ arraytest1(dllfind.AddrOfPinnedObject()));
dllfind.Free();}
雖然沒有報錯但一運行就直接崩了,求問各位大神有什麼解決辦法
請使用int[][] array = new int[][2]{new int[2]{1,2}, new int[2]{3,4}};,然後慢慢pin成IntPtr[],再pin成IntPtr,調用玩苦逼的unpin回來。
int[2,2]在C++裡面被解釋成了int[2][2],傳進函數里統統都是int*(而不是int**),是1維數組的2維語法糖。
數組跟指針的指針是有區別的,int a[10][10];使用 int **的時候,不知道是int[10[],還是int[200][],簡單點就改成1維數組int a[10][];p=(int *)a;
a[i][j]=p[10*i+j]
建議還是別用二維數組了,統統用一維數組存,取值的時候下標都經由計算出來 int []arrary=new int[rows*cols];for(int i=0;i for(int j=0;j array[i*cols+j]=0;//這裡cols要乘的是外層循環的游標(i),搞反了會降低cache的命中率。
如果是圖像數據,建議c#和c dll之間用IntPtr傳數據。如果想支持二維數組,在c#里做轉換。如果c api不好改,那就按輪子哥的,pin成IntPtr,存到一個IntPtr數組,pin IntPtr數組,調用c api,在反順序unpin回來。
推薦閱讀:
※如何用unity做兩面互相反射的鏡子?
※如何用高效的用 shader 實現柱狀圖?
※哪裡有Unity3D遊戲開發的教程?
※C#初學者問一個問題?