Вы должны быть в состоянии передать параметр unsigned char * в виде байта [], и стандартный маршаллер P / Invoke должен обрабатывать это. Вы должны будете упорядочить выходные данные без знака char * самостоятельно, но это должен быть просто вызов Marshall.Copy (). Ниже приведен пример того, что, я думаю, будет работать.
Два больших вопроса:
- Как вызывающая сторона узнает размер данных, хранящихся в возвращаемом беззнаковом буфере char *?
- Как распределяется память для возврата беззнакового буфера char *? Вы должны освободить его и как вы будете освобождать его от C #, если вам нужно?
Пример:
[DllImport("Name.dll")]
private static extern IntPtr Compress([MarshalAs(UnmanagedType.LPArray)]byte[] buffer, int size);
[DllImport("Name.dll")]
private static extern IntPtr Decompress([MarshalAs(UnmanagedType.LPArray)]byte[] buffer, int size);
public static byte[] Compress(byte[] buffer) {
IntPtr output = Compress(buffer, buffer.Length);
/* Does output need to be freed? */
byte[] outputBuffer = new byte[/*some size?*/];
Marshal.Copy(output, outputBuffer, 0, outputBuffer.Length);
return outputBuffer;
}
public static byte[] Decompress(byte[] buffer) {
IntPtr output = Decompress(buffer, buffer.Length);
/* Does output need to be freed? */
byte[] outputBuffer = new byte[/*some size?*/];
Marshal.Copy(output, outputBuffer, 0, outputBuffer.Length);
return outputBuffer;
}