Я пытаюсь передать необработанные данные текстуры из 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 ++?
Несколько вещей, которые вам нужно сделать с вашим текущим кодом:
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
}
}
Других решений пока нет …