Ваш дисбаланс стека, вероятно, вызван различием в соглашении о вызовах.Соглашение о вызовах по умолчанию в DllImport
равно WinApi
(которое в свою очередь по умолчанию равно StdCall
).Вполне вероятно, что ваша функция C ++ использует Cdecl
соглашение о вызовах.Вам нужно будет показать нам определение EXPORT_API, чтобы быть уверенным.
Дисбаланс стека происходит, потому что StdCall
ожидает, что вызванная функция очистит стек, а Cdecl
ожидает, что вызывающая сторона очиститвверх по стеку.Поэтому, если программа, ожидающая, что StdCall
вызовет функцию Cdecl
, стек не будет очищен.В противном случае (Cdecl
вызов StdCall
) стек очищается дважды.
Вы можете изменить DllImport
на Cdecl
, например:
[DllImport("APlugin", CallingConvention=CallingConvention.Cdecl)]