«Обнаружен PInvokeStackImbalance» из HDFDotNet 1.8.7 - PullRequest
0 голосов
/ 27 мая 2011

Я пытался обновиться до последних оболочек HDF5DotNet (1.8.7) и получаю следующие предупреждения (при работе в режиме отладки от VS2010):

PInvokeStackImbalance был обнаружен Сообщение: вызов функции PInvoke 'HDF5DotNet! :: H5Fopen' разбалансировал стек. Это вероятно потому, что управляемая подпись PInvoke не совпадает с неуправляемой целевой подписью. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи.

Я использую предварительно скомпилированные двоичные файлы (сборка HDF5DotNet для 32-разрядной версии .NET Framework 4.0), но получил тот же результат при компиляции из исходного кода.

Странно, но при запуске моего приложения, которое вызывает обертки HDF5DotNet в режиме, отличном от DEBUG, я не вижу проблем. Я заметил, что между 1.8.6 и 1.8.7 все соглашения о вызовах были переключены с Cdecl на StdCall. Может ли это быть причиной этого? Я видел другие форумы, на которых говорилось, что CallingConvention должна быть Cdecl ...

Спасибо!

1 Ответ

2 голосов
/ 27 мая 2011

Да, вызов функции stdcall как cdecl или наоборот вызывает дисбаланс стека. Основное различие между этими соглашениями заключается в том, что при cdecl вызывающий отвечает за удаление аргументов из стека, а при stdcall - вызываемый .

Полагаю, в режиме релиза у вас та же ошибка. Но вы не получите ошибку, потому что некоторые проверки во время выполнения отключены. Нативная программа аварийно завершает работу в большинстве случаев, когда вы используете неправильное соглашение о вызовах, но кажется, что код взаимодействия .net имеет более надежную обработку стека, которая маскирует эту проблему.

...