Несбалансированный стек! - PullRequest
7 голосов
/ 13 ноября 2010

Я написал VC ++ DLL. Объявление для одного из методов в dll выглядит следующим образом:

extern "C" _declspec(dllexport)
void startIt(int number)
{
     capture = cvCaptureFromCAM(number);
}

Я использую эту DLL в коде C #, используя P / Invoke. Я делаю декларацию как:

[DllImport("Tracking.dll", EntryPoint = "startIt")]
        public extern static void startIt(int number);

и я вызываю функцию в коде как:

startIt(0);

Теперь, когда эта строка встречается, компилятор выдает мне эту ошибку:

A call to PInvoke function 'UsingTracking!UsingTracking.Form1::startIt' has 
unbalanced the stack. This is likely because the managed PInvoke signature does 
not match the unmanaged target signature. Check that the calling convention 
and parameters of the PInvoke signature match the target unmanaged signature.

Я не могу понять, почему выдает эту ошибку, поскольку подпись в управляемом и неуправляемом коде одинакова. Более того, на моей другой машине тот же код отлично работает в Visual Studio. Таким образом, это заставляет меня думать, что выброшенная ошибка является ошибочной.

Пожалуйста, помогите.

Спасибо

Ответы [ 3 ]

13 голосов
/ 13 ноября 2010

Когда вы вызываете / вызываете внешнюю функцию, в соглашении о вызовах используются значения по умолчанию __stdcall.Поскольку ваша функция использует соглашение __cdecl, вам необходимо объявить его следующим образом:

[DllImport("Tracking.dll", EntryPoint = "startIt",
    CallingConvention = CallingConvention.Cdecl)]
public extern static void startIt(int number);
6 голосов
/ 13 ноября 2010

Не могли бы вы пропустить CallingConvention=CallingConvention.Cdecl в атрибуте DllImport?

4 голосов
/ 07 января 2011

Константин и Фредерик Хамиди правильно ответили на этот вопрос о том, как решить эту проблему. Это может помочь избежать возможного переполнения стека. Я сам это укусил несколько раз. Что действительно важно, так это то, что в .NET 4 включен управляемый помощник по отладке для отладочных (не выпускаемых) сборок на 32-битных компьютерах с архитектурой x86 (не 64-битных), которые проверяют неправильно заданный вызов p / invoke. Эта статья MSDN подробно описывает это: http://msdn.microsoft.com/en-us/library/0htdy0k3.aspx. Стивен Клири заслуживает похвалы за определение этого в этом посте: pinvokestackimbalance - как я могу это исправить или отключить?

...