Использование DLLImport с выходным символом [], содержащим нулевые символы - PullRequest
2 голосов
/ 07 декабря 2009

Я пишу приложение на c #, используя .NET 2.0. Мне нужно использовать старую библиотеку для проприетарного сжатия. У меня нет исходного кода для библиотеки, и разработчиков за ним давно нет.

Моя проблема в том, что результирующий символ [] содержит нули и усекается. Вот объявление для функции:

[DLLImport("foo.dll")]
public static extern bool CompressString(char[] inputValue, out char[] outputValue, uint inputLength, out uint outputLength);

Как я могу объявить, что выходной символ [] должен обрабатываться как байт [], а не завершаться нулем?


Подробнее:

У меня есть файл заголовка. Вот декларация:

BOOL CompressString(char *DecompBuff, char **RetBuff, unsigned long DecompLen, unsigned long *RetCompLen);

Ответы [ 2 ]

3 голосов
/ 07 декабря 2009

Посмотрите статью MSDN для передачи массивов в P / Invoke. Я думаю, что вы можете использовать SizeParamIndex, чтобы сообщить маршаллеру, какой аргумент содержит размер передаваемого массива.

Редактировать: SizeParamIndex, к сожалению, не разрешено для параметров out и ref. Однако вы можете скопировать его вручную:

[DLLImport("foo.dll")]
public static extern bool CompressString([MarshalAs(UnmanagedType.LPArray, SizeParamIndex=2)] char[] inputValue, out IntPtr outputValue, uint inputLength, out uint outputLength);

public static bool CompressStringInvoke(char[] inputValue, out char[] outputValue, uint inputLength) {
    IntPtr outputPtr;
    uint outputLen;
    if (CompressString(inputValue, out outputPtr, inputLength, out outputLen)) {
        outputValue = new char[outputLen];
        Marshal.Copy(outputPtr, outputValue, 0, (int)outputLen);
        return true;
    }
              outputValue = new char[0];
    return false;
}
0 голосов
/ 07 декабря 2009

Pinvoke.Net должен дать вам несколько советов по объявлению подписи вашего метода

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