Предупреждение pInvokeStackImbalance MDA и как его отключить или исправить - PullRequest
1 голос
/ 16 апреля 2011
    [DllImport( "zlib32" )]
    private static extern ZLibError compress2( 
                byte[] dest,
                ref int destLength, 
                byte[] source, 
                int sourceLength, 
                ZLibQuality quality 
            );

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

Ответы [ 3 ]

3 голосов
/ 16 апреля 2011

Этот MDA поднят, чтобы сообщить вам, что у вас есть проблема с типом параметров, который вы используете для вызова PInvoke. Как правило, очень плохая идея отключить его , поскольку он предупреждает о проблеме в вашем коде, а несбалансированный стек приводит к ошибкам (иногда трудно найти) в будущем.

Обычно, общая ошибка выбирается для совпадения неуправляемого типа с управляемым.

В вашем случае, оригинальное определение (я смотрю на zlib125.zip ):

ZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,
                                  const Bytef *source, uLong sourceLen,
                                  int level)); 

, на который можно перейти, если библиотека была скомпилирована с 64-битной поддержкой unsigned long:

static int compress2(
    byte[] dest,
    ref ulong destLength,
    byte[] source,
    ulong sourceLength,
    int level)

Убедитесь, что перечисление ZLibQuality основано на int. Возможно, ваша ошибка - использование int вместо ulong для обеих длин.

Как сказал Дэвид Хеффернан, существует множество других причин, по которым невозможно найти точную, дайте нам ссылку на библиотеку, фактически используемую для разработки, если вы все еще хотите знать.

  • традиционная библиотека оригинальной компиляции с Visual C ++ приведет к тому, что вы получите библиотеку только с 32-битной поддержкой, поэтому приведенное вами оригинальное определение является действительным, если только перечисление ZLibQuality не основано int

  • возможно, вы пытаетесь использовать библиотеку, скомпилированную для других соглашений о вызовах, таких как cdecl вместо stdcall

  • возможно, вы пытаетесь использовать модифицированную библиотеку, где функция compress2 принимает дополнительные параметры.

Мы можем найти, что не так, когда увидим, какую именно библиотеку вы используете.

long или unsigned long обычно 32-битные под Windows и отображаются на int или uint соответственно. Поскольку у вас есть проблемы с оригинальным объявлением, я предположил, что, возможно, вы используете конкретную библиотеку с поддержкой 64-битных систем Спасибо Дэвиду Хеффернану за то, что он указал на меня, ясно делает мое замечание.

В качестве справки можно использовать следующие ресурсы:

  • Вики для разработчиков .NET - PInvoke.net - это прежде всего вики, позволяющая разработчикам находить, редактировать и добавлять подписи PInvoke *, пользовательские типы и любую другую информацию, связанную с вызов Win32 и других неуправляемых API из управляемого кода

  • PInvoke Interop Assistant

/ Offtopic:

Почему вы используете собственную реализацию с привязками к библиотеке? Вы можете использовать:

  • DotNetZip - Zip и Unzip на C #, VB, на любом языке .NET - DotNetZip - это простая в использовании, БЫСТРАЯ, БЕСПЛАТНАЯ библиотека классов и набор инструментов для работы с zip-файлами или папками. Zip и Unzip просты: с помощью DotNetZip приложения .NET, написанные на VB, C # - на любом языке .NET - могут легко создавать, читать, извлекать или обновлять zip-файлы. Для моно или MS .NET.

  • или готов к использованию привязок 7-zip: SevenZipSharp - Управляемая библиотека 7-zip, написанная на C #, которая обеспечивает извлечение и сжатие данных (самостоятельно) (поддерживаются все форматы 7-zip) , Он включает 7z.dll или любой другой совместимый файл и использует LZMA SDK.

1 голос
/ 16 апреля 2011

Дисбаланс стека связан с тем, что у вас несовместимые соглашения о вызовах или несоответствующие объявления функций.Я был бы очень удивлен, если бы zlib32 использовал stdcall соглашение о вызовах.Конечно, это использует cdecl.Я бы хотел увидеть ваше объявление C ++ об этой функции, прежде чем дать более твердый совет.

Оставьте предупреждение включенным, потому что он находит ошибки в вашем коде, и исправляйте несоответствия, какими бы они ни были.

0 голосов
/ 16 апреля 2011

Здесь может быть реальная проблема, но мне обычно приходится время от времени отключать всех помощников по управляемой отладке, поскольку некоторые из них волшебным образом включаются. Не забудьте проверить Debug | Узел исключений, затем разверните Помощников по управляемой отладке и убедитесь, что каждый из них отключен.

РЕДАКТИРОВАТЬ: Вам повезет больше, заменив P / Invoke на оболочку C ++ / CLI, которую вы создаете для compress2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...