3 Stimmen

Marshalling arrays from C# to C++ and back: PInvokeStackImbalance

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.

3voto

Hans Passant Punkte 894572

Sie müssen die CallingConvention-Eigenschaft von DllImport verwenden. Cdecl ist hier erforderlich, da Sie die C-Funktion nicht als __stdcall deklariert haben. Sie benötigen kein [MarshalAs], die von Ihnen verwendeten Werte sind bereits die Standardwerte. Also:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X