Почему я получаю PInvoceStackImbalance при попытке выполнить неуправляемый код - PullRequest
0 голосов
/ 13 февраля 2019

Я вызываю функции из неуправляемой DLL в C #.И один из моих звонков на эту DLL работает.Но у другого есть более продвинутые параметры, и когда я выполняю функцию в моем коде C #:

[DllImport("IOLUSBIF20.dll", CallingConvention = CallingConvention.StdCall)]
public static extern long IOL_SetTransparentModeExt(long Handle, UInt32 Port, ref TTransparentParameters pTransparentParameters);

, я получаю следующую ошибку:

"PInvokeStackImbalance": "вызовв функцию PInvoke 'Интерфейс устройства IO-Link! IO_Link_Device_Interface.IOLUSBIF20Wrapper :: IOL_SetTransparentModeExt' имеет несбалансированный стек. Это, вероятно, потому, что управляемая подпись PInvoke не соответствует неуправляемой целевой подписи. Проверьте, что соглашение о вызовах и параметры подписи PInvoke совпадаютцелевая неуправляемая подпись. "

В заголовке подпись функции (и структуры) определяется следующим образом:

LONG __stdcall IOL_SetTransparentModeExt(LONG Handle, DWORD Port, TTransparentParameters * pTransparentParameters);


typedef struct TTransparentParametersStruct
{
  BYTE StartPattern[16];    /**< starting pattern */
  BYTE ReturnPattern[32];   /**< returning pattern */
} TTransparentParameters;

Структура, которую я передаю в качестве аргументаВыглядит следующим образом:

[StructLayout(LayoutKind.Sequential)]
    public struct TTransparentParameters
    {
        public Byte[] StartPattern;    /**< starting pattern */
        public Byte[] ReturnPattern;   /**< returning pattern */
    }

1 Ответ

0 голосов
/ 13 февраля 2019

Ваш стек не сбалансирован, потому что неуправляемая структура данных состоит из

BYTE StartPattern[16];    /**< starting pattern */
BYTE ReturnPattern[32];   /**< returning pattern */

, которые занимают 48 байтов, тогда как ваша управляемая интерпретация этих полей имеет неправильный размер.Если вы указываете размер маршалеру, ваш стек должен быть сбалансирован:

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public Byte[] StartPattern;    /**< starting pattern */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public Byte[] ReturnPattern;   /**< returning pattern */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...