我有一个本地库,其中包含一些本地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*列表:
  • 输入参数列表(即prhs,在matlab的一侧初始化)
  • 输出参数列表(即plh,都初始化为零,但我应该在其中写入)

  • 目前,根据我所做的测试,它仅返回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/

    10-13 06:26