C ++:

аюсь передать необработанные данные текстуры из Texture2D (байтовый массив) в неуправляемый код C ++. В C # длина массива кода составляет около 1,5kk, однако в C ++ sizeof всегда возвращает 8.

C # объявление нативного метода:

[DllImport("LibName", CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr ProcessData(byte[] data);

C ++:

extern "C" {
    __declspec(dllexport) void ProcessData(uint8_t *data) {
        //sizeof(data) is always 8
    }
}

Что я делаю неправильно? Есть ли способ передать массив без дополнительного выделения памяти в коде C ++?

 UnholySheep02 окт. 2017 г., 16:29
sizeof(data) говорит вам размеруказатель, вы не можете определить размер указанного массива из указателя, вам нужно передать его отдельно

Ответы на вопрос(1)

Решение Вопроса

1.Вы должны отправить размер массива плагину C ++ с другим параметром какUnholySheep упоминается.

2Вы также должны закрепить массив перед отправкой на сторону C ++. Это сделано сfixed ключевое слово илиGCHandle.Alloc функция.

3.Если функция C ++ имеет тип возвращаемого значения void, ваша функция C # также должна иметь тип возвращаемого значения void.

Ниже приведена исправленная версия вашего кода. Дополнительное выделение памяти не выполняется.

C #:

[DllImport("LibName", CallingConvention = CallingConvention.Cdecl)]
static extern void ProcessData(IntPtr data, int size);

public unsafe void ProcessData(byte[] data, int size)
{
    //Pin Memory
    fixed (byte* p = data)
    {
        ProcessData((IntPtr)p, size);
    }
}

C ++:

extern "C" 
{
    __declspec(dllexport) void ProcessData(unsigned char* data, int size) 
    {
        //sizeof(data) is always 8
    }
}

Ваш ответ на вопрос