Corregir matrices de C # a C ++ y viceversa: PInvokeStackImbalance

Tengo una función de C ++ a la que me gustaría acceder desde C #. El problema es que sigo recibiendo excepciones de PInvokeStackImbalance y no sé por qué. Todo funciona bien y, como se esperaba, cuando se verifica esa excepción está desactivado

La firma de mi función de C ++ es:

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) 

y lo que he estado usando para acceder es:

  [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); 

También lo he probado con solo la opción UnmanagedType.LPArray y nada en absoluto. Me imagino que hay un detalle sobre PInvoke que simplemente no entiendo y lo apreciaría si alguien lo señalara.

Necesitas usar la propiedad CallingConvention de DllImport. Aquí se requiere Cdecl ya que no declaró la función C como __stdcall. No necesita [MarshalAs], los valores que usa ya son los predeterminados. Así:

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