解决方案 »

  1.   

    byte[] pdata修改为
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=3)] byte[] pdata
      

  2.   

     这样:public delegate bool DataCallBack(int index, int type, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] byte[] data, int len, int width, int height);
    还是这样:
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=3)]
    public delegate bool DataCallBack(int index, int type, byte[] data, int len, int width, int height);?能讲下原因不?
      

  3.   

    修饰在参数的前面,告诉程序, data 是一个数组。
    但是 C++ 的数组长度是有单独的参数来说明的。此时需要告诉程序是哪个参数来修饰数组的长度的。
    这个修饰就是 SizeParamIndex,表示这个长度在从 0 开始的第三个参数。C++ 如何修饰的,可以看看 IDL 。C# 修饰在整个函数的前面,是用来修饰返回值的,而且需要[return:MarshalAs()]。
    所以第二个是编译不过的。