PInvokeStackImbalance при вызове функции dll из C # - PullRequest
2 голосов
/ 29 июля 2011

Я пишу приложение WPF, которое должно вызывать некоторый код C ++, который существует в dll, который я написал. Я всегда получаю ошибки PInvokeStackImbalance, даже с самыми простыми тестовыми функциями. Например, в C ++ dll:

extern "C" __declspec(dllexport) void Test( int foo);

Функция ничего не делает. Сторона c # выглядит так:

    [DllImport("myDll.dll", CharSet = CharSet.Auto)]
    private static extern void Test( int foo);

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

Тест (1)

... и я получаю PInvokeStackImbalance !! Как это может быть?

Заранее спасибо ...

Tom

Ответы [ 2 ]

5 голосов
/ 29 июля 2011

Попробуйте указать CallingConvention.Cdecl . Есть пример в док. Соглашение о вызовах по умолчанию Winapi в окнах рабочего стола; но ваша функция объявлена ​​как extern C.

2 голосов
/ 29 июля 2011

В вашей декларации [DllImport] отсутствует CallingConvention. Обязательно, ваша функция Test - Cdecl, так как вы не использовали ключевое слово __stdcall. Разница между __cdecl и __stdcall заключается в способе очистки стека после вызова. __cdecl является значением по умолчанию для большинства компиляторов C ++, включая Microsoft. Чтобы исправить это на стороне C ++, вы должны объявить это так:

extern "C" __declspec(dllexport) 
void __stdcall Test( int foo);
...