PInvokeStackBalance продолжает обнаруживаться, пока подпись в порядке - PullRequest
0 голосов
/ 21 января 2011

У меня небольшая проблема с моим кодом. У меня есть неуправляемый C ++ .dll, который я хочу использовать с аплодисментами C #.

Функция C ++ в dll выглядит так:

void EXPORT_API vSetLights(BYTE byLights)
{
    remote.SetLEDs(byLights);
}

Код C # выглядит следующим образом:

    [DllImport("APlugin")]
    private static extern void vSetLights(byte byLights);

И я вызываю функцию так:

        byte byLeds = 0x0;
        vSetLights(byLeds);

Если я прав, подпись функции в порядке (оба ничего не возвращают и не требуют байта), но PInvokeStackBalance продолжает появляться. После этого приложение работает нормально, могу ли я безопасно его игнорировать или есть исправление?

Спасибо

Wesley

1 Ответ

2 голосов
/ 21 января 2011

Ваш дисбаланс стека, вероятно, вызван различием в соглашении о вызовах.Соглашение о вызовах по умолчанию в DllImport равно WinApi (которое в свою очередь по умолчанию равно StdCall).Вполне вероятно, что ваша функция C ++ использует Cdecl соглашение о вызовах.Вам нужно будет показать нам определение EXPORT_API, чтобы быть уверенным.

Дисбаланс стека происходит, потому что StdCall ожидает, что вызванная функция очистит стек, а Cdecl ожидает, что вызывающая сторона очиститвверх по стеку.Поэтому, если программа, ожидающая, что StdCall вызовет функцию Cdecl, стек не будет очищен.В противном случае (Cdecl вызов StdCall) стек очищается дважды.

Вы можете изменить DllImport на Cdecl, например:

[DllImport("APlugin", CallingConvention=CallingConvention.Cdecl)]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...