我有一个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的细节,我只是没有得到,如果有人指出,我会很感激。
答案 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...
}