У меня есть неуправляемая функция C ++, которая вызывает управляемый метод C # в DLL.Цель метода C # состоит в том, чтобы взять массив байтов (выделенных вызывающей стороной C ++), заполнить массив и вернуть его.Я могу получить массив INTO метод C #, но заполненные данные теряются, когда они возвращаются к функции C ++.Прямо сейчас это мой тестовый код для отладки процесса:
C # DLL метод:
// Take an array of bytes and modify it
public ushort GetBytesFromBlaster([MarshalAs(UnmanagedType.LPArray)] byte[] dataBytes)
{
dataBytes[0] = (byte)'a';
dataBytes[1] = (byte)'b';
dataBytes[2] = (byte)'c';
return 3;
}
C ++ функция, которая вызывает DLL:
// bytes[] has been already allocated by its caller
short int SimGetBytesP2P(unsigned char bytes[])
{
unsigned short int numBytes = 0;
bytes[0] = 'x';
bytes[1] = 'y';
bytes[2] = 'z';
// bytes[] are {'x', 'y', 'z'} here
guiPtr->GetBytesFromBlaster(bytes, &numBytes);
// bytes[] SHOULD be {'a', 'b', 'c'} here, but they are still {'x', 'y', 'z'}
return(numBytes);
}
Я полагаю, что это как-то связано с тем, что C # превращает указатель C ++ в новый управляемый массив, но изменяет исходный.Я пробовал несколько вариантов, используя модификатор "ref" и т. Д., Но не повезло.Кроме того, эти данные НЕ являются строками с нулевым символом в конце;байты даты представляют собой необработанные 1-байтовые значения, не заканчивающиеся нулем.
Может кто-нибудь пролить свет на это?Спасибо!
Стюарт