Как обернуть две неуправляемые функции C ++ в две управляемые функции C #? - PullRequest
0 голосов
/ 06 мая 2010

У меня есть две неуправляемые функции C ++, Compress и Decompress. Аргументы и возвраты идут следующим образом:

unsigned char * Compress (unsigned char *, int)

unsigned char * Decompress (unsigned char *, int)

Где все учары являются массивами учаров.

Может кто-нибудь помочь мне выложить способ конвертировать их в управляемый код C #, используя массив Byte [] вместо unsigned char *? Большое спасибо!

1 Ответ

1 голос
/ 06 мая 2010

Вы должны быть в состоянии передать параметр unsigned char * в виде байта [], и стандартный маршаллер P / Invoke должен обрабатывать это. Вы должны будете упорядочить выходные данные без знака char * самостоятельно, но это должен быть просто вызов Marshall.Copy (). Ниже приведен пример того, что, я думаю, будет работать.

Два больших вопроса:

  1. Как вызывающая сторона узнает размер данных, хранящихся в возвращаемом беззнаковом буфере char *?
  2. Как распределяется память для возврата беззнакового буфера 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;
    }
...