我有一个本地库,其中包含一些本地ntype
,并想在其中调用一些功能。
我能够为以下人员编码:
foo1(ntype** p) ==> foo1(IntPtr[] p)
但是不知道该怎么做:
foo1(ntype*[] p) ==> foo1(<???> p)
至少
IntPtr[]
不起作用。编辑
我尝试使用的非托管函数是:
extern mxArray* mclCreateSimpleFunctionHandle(mxFunctionPtr fcn);
其中
mxFunctionPtr
是:typedef void(*mxFunctionPtr)(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);
这表示对以下matlab函数签名的调用:
function [varargout] = callback(varargins)
%[
%% Do callback code %%
%]
显然,根据我的期望,此函数指针应为我提供2个
mxArray*
列表:目前,根据我所做的测试,它仅返回
mxArray*
和plhs
列表中的首个prhs
最佳答案
首先要做的是将您的 native ntype
转换为托管struct
。
例如:
public struct Ntype
{
public int Field1;
public long Field2;
}
然后,在C#代码中使用简单的
IntPtr
参数定义方法。[DllImport]
static void foo1(IntPtr myParam);
最后是使用方法:
IntPtr buffer = IntPtr.Zero;
try
{
// Allocates a buffer. The size must be known
buffer = Marshal.AllocHGlobal(0x1000);
// Call to your unmanaged method that fills the buffer
foo1(buffer);
// Casting the unmanaged memory to managed structure that represents
// your data
Ntype obj = (Ntype)Marshal.PtrToStructure(buffer, typeof(Ntype));
}
finally
{
// Free unmanaged memory
if (buffer != IntPtr.Zero)
{
Marshal.FreeHGlobal(buffer);
}
}
关于c# - PInvoke-如何为 'SomeType* []'编码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8741879/