编组从C#到C ++的数组并返回:PInvokeStackImbalance

时间:2010-07-08 07:45:14

标签: c# pinvoke

我有一个C ++函数,我想从C#访问。问题是我一直得到PInvokeStackImbalance异常,我不知道为什么。一切都运行正常,并且在检查该异常时关闭了。

我的C ++函数的签名是:

extern "C" double solveQP(
    int32_t n, int32_t mE, int32_t mI,
    double *p_G, double *p_g0,
    double *p_CE, double *p_ce0,
    double *p_CI, double *p_ci0,
    double *p_x)

以及我用来访问它的是:

        [DllImport("libQuadProg.dll")]
        [return: MarshalAs(UnmanagedType.R8)]
        private static extern double solveQP(
            [In, MarshalAs(UnmanagedType.I4)] int n,
            [In, MarshalAs(UnmanagedType.I4)] int mE,
            [In, MarshalAs(UnmanagedType.I4)] int mI,
            [In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8)] double[] p_G,
            [In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8)] double[] p_g0,
            [In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8)] double[] p_CE,
            [In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8)] double[] p_ce0,
            [In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8)] double[] p_CI,
            [In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8)] double[] p_ci0,
            [In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8)] double[] p_x);

我也只使用UnmanagedType.LPArray选项尝试了它,什么都没有。我认为有一个关于PInvoke的细节,我只是没有得到,如果有人指出,我会很感激。

1 个答案:

答案 0 :(得分:3)

您需要使用DllImport的CallingConvention属性。这里需要Cdecl,因为您没有将C函数声明为__stdcall。您不需要[MarshalAs],您使用的值已经是默认值。因此:

    [DllImport("libQuadProg.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern double solveQP(
        int n, int mE, int mI,
        double[] p_G,
        // etc...
    }