получить указатель на байтовый массив из неуправляемой c ++ dll в c # - PullRequest
2 голосов
/ 25 ноября 2011

в с ++ у меня есть такая функция

extern "C" _declspec(dllexport) uint8* bufferOperations(uint8* incoming, int size)

Я пытаюсь позвонить с c # вот так

[DllImport("MagicLib.DLL", CallingConvention = CallingConvention.Cdecl)]
//[return: MarshalAs(UnmanagedType.ByValArray)]//, ArraySubType=UnmanagedType.SysUInt)]
public static extern byte[] bufferOperations(byte[] incoming, int size);

Но я получаю Невозможно выполнить маршализацию 'возвращаемого значения': недопустимая комбинация управляемого / неуправляемого типа

(((Вопрос в том, как правильно это упорядочить? Спасибо за чтение моего вопроса

Ответы [ 2 ]

9 голосов
/ 25 ноября 2011

byte [] - это тип массива .Net с известной длиной. Вы не можете маршировать байт *, потому что .Net не знает длину выходного массива. Вы должны попробовать ручную сортировку. Заменить байт [] на байт *. Затем сделайте так:

[DllImport("MagicLib.DLL", CallingConvention = CallingConvention.Cdecl)]
public static extern byte* bufferOperations(byte* incoming, int size);

public void TestMethod()
{
    var incoming = new byte[100];
    fixed (byte* inBuf = incoming)
    {
        byte* outBuf = bufferOperations(inBuf, incoming.Length);
        // Assume, that the same buffer is returned, only with data changed.
        // Or by any other means, get the real lenght of output buffer (e.g. from library docs, etc).
        for (int i = 0; i < incoming.Length; i++)
            incoming[i] = outBuf[i];
    }
}
1 голос
/ 08 октября 2016

Вам не нужно использовать unsafe contexts в этом случае.Просто используйте IntPtr .

[DllImport("MagicLib.DLL", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr bufferOperations(IntPtr incoming, int size);

И тогда вы можете использовать Marshal.Copy , чтобы получить из него свой байтовый массив.

...