PInvokeStackImbalance был обнаружен на WriteFile kernel32.dll - PullRequest
0 голосов
/ 29 июня 2011

После того, как я перешел с Framework 2 на Framework 4, я получаю сообщение об ошибке при запуске функции WriteFile.

[DllImport("kernel32.dll")]
        public static extern bool WriteFile(SafeHandle hFile,
            byte[] lpBuffer, 
            uint nNumberOfBytesToWrite, 
            out uint lpNumberOfBytesWritten, 
           long lpOverlapped);

Решение:

 [DllImport("kernel32.dll")]
        public static extern bool WriteFile(SafeHandle hFile, 
            byte[] lpBuffer, 
            uint nNumberOfBytesToWrite, 
            out uint lpNumberOfBytesWritten, 
           **Int32** lpOverlapped);

Параметр lpOverlapped должен быть int32, который является длинной без знака в неуправляемый C ++.

Исходная ошибка:

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

1 Ответ

1 голос
/ 29 июня 2011

lpOverlapped - это указатель, и вы должны объявить его как IntPtr или как параметр ref.

Вы запускаете 32-битный процесс и ранее передавали 64-битное целое число, long, когда ожидался указатель. Более новая версия среды выполнения .net обнаруживает ошибку.

Решение, безусловно, состоит в том, чтобы не объявлять параметр как Int32. Тогда это будет неправильно, если вы когда-нибудь скомпилируете 64-битную цель.

Поскольку вы, похоже, не используете перекрывающийся ввод-вывод, я бы просто использовал IntPtr и передал IntPtr.Zero.

[DllImport("kernel32.dll")]
static extern bool WriteFile(
    IntPtr hFile,
    byte[] lpBuffer,
    uint nNumberOfBytesToWrite, 
    out uint lpNumberOfBytesWritten,
    IntPtr lpOverlapped
);
...