我有一个本地库,其中包含一些本机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*:
目前,从我所做的测试中,它只返回首创mxArray*的plhs并prhs表
知道了
' ' 的正确编组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