Ich habe eine C++ Funktion, auf die ich aus C# zugreifen möchte. Das Problem besteht darin, dass ich immer PInvokeStackImbalance-Ausnahmen erhalte und nicht weiß warum. Alles läuft einwandfrei und wie erwartet, wenn die Überprüfung auf diese Ausnahme deaktiviert ist.
Die Signatur meiner C++ Funktion lautet:
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)
Und das, was ich zur Anbindung benutzt habe, ist:
[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);
Ich habe es auch mit nur der Option UnmanagedType.LPArray und überhaupt keiner Option versucht. Ich denke, es gibt ein Detail zu PInvoke, das ich einfach nicht verstehe, und ich wäre dankbar, wenn mir jemand darauf hinweisen würde.