У меня есть DLL, написанная на C ++, которая является оболочкой для C # вокруг библиотеки LZO. Но для целей тестирования я хочу знать, могу ли я преобразовать типы, поэтому я создал тестовую функцию, которая принимает содержимое и размер файла и записывает его копию.
extern "C"{
__declspec(dllexport) void WriteFile(lzo_uint8 * source, int size)
{
FILE * fileToWrite;
fileToWrite = fopen("test.eix", "wb+");
if (fileToWrite)
{
fwrite(source, 1, size, fileToWrite);
}
fclose(fileToWrite);
free(source);
}
}
Вот изображение кода, для лучшей читаемости: http://i.epvpimg.com/u4mgh.png
Затем я импортирую это так:
[DllImport(@"GLZO.dll")]
public static extern void WriteFile(byte[] source, int size);
И назовите это так:
byte[] g = ReadFile("raw/roota.eix");
WriteFile(g, g.Length);
Проблема не в функции ReadFile, я проверял это. Я создал копию из другого файла и проверил обе контрольные суммы.
Итак, мой вопрос: как мне преобразовать байт [] в lzo_uint8 * (без знака char *)?
Понял! Мне просто нужно было упорядочить его в IntPtr, без знака char * = IntPtr в C #.
Кроме того, чтобы избежать исключений, касающихся «неэквивалентных» типов, вам нужно импортировать dll следующим образом:
[DllImport(@"GLZO.dll", CallingConvention = CallingConvention.Cdecl)]
Других решений пока нет …