Выделение массивов из C # в C ++ и обратно: PInvokeStackImbalance - PullRequest
3 голосов
/ 08 июля 2010

У меня есть функция 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 Ответ

3 голосов
/ 08 июля 2010

Вам необходимо использовать свойство CallingConvention DllImport.Здесь требуется 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...
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...