PInvoke - 如何编组'SomeType*[]'?

Cit*_*ane 5 c# pinvoke

我有一个本地库,其中包含一些本机ntype,并希望在其中调用一些函数.

我能够为:

foo1(ntype** p) ==> foo1(IntPtr[] p)
Run Code Online (Sandbox Code Playgroud)

但不知道如何做到:

foo1(ntype*[] p) ==> foo1(<???> p)
Run Code Online (Sandbox Code Playgroud)

至少IntPtr[]没有奏效.

编辑

我试图编组的非托管函数是:

extern mxArray* mclCreateSimpleFunctionHandle(mxFunctionPtr fcn);
Run Code Online (Sandbox Code Playgroud)

在哪里mxFunctionPtr:

typedef void(*mxFunctionPtr)(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);
Run Code Online (Sandbox Code Playgroud)

这表示调用以下matlab函数签名:

function [varargout] = callback(varargins)
%[
    %% Do callback code %%
%]
Run Code Online (Sandbox Code Playgroud)

显然,从我的期望来看,这个函数指针应该为我提供了2个列表mxArray*:

  • 输入参数列表(即prhs,在matlab端初始化)
  • 输出参数列表(即plhs,全部初始化为零,但我应该写入)

目前,从我所做的测试中,它只返回首创mxArray*plhsprhs

Cit*_*ane 2

知道了

' ' 的正确编组SomeTime* []如下:

extern mxArray* mclCreateSimpleFunctionHandle(mxFunctionPtr fcn);
typedef void(*mxFunctionPtr)(int nlhs, mxArray* plhs[], int nrhs, mxArray* prhs[]);
Run Code Online (Sandbox Code Playgroud)

是:

// For function pointer
[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public delegate void MCRInteropDelegate(int nlhs,
                                        [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.SysInt, SizeParamIndex = 0)][Out] IntPtr[] plhs, 
                                        int nrhs,
                                        [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.SysInt, SizeParamIndex = 2)][In] IntPtr[] prhs);

// For API function
[DllImport(DLLNAME, EntryPoint = "mclCreateSimpleFunctionHandle", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)]
private static extern IntPtr _mclCreateSimpleFunctionHandle(MCRInteropDelegate fctn);
Run Code Online (Sandbox Code Playgroud)

解释

MarshalAs属性指示将编组SomeTime*[]为 a LPArrayof IntPtr,其中数组的大小包含在从零开始的索引处的函数参数中SizeParamIndex