Этот 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.