Я создал кроссплатформенную DLL на C ++, которая компилируется как в Windows, так и в Mac OSX. В Windows у меня есть приложение C #, которое вызывает библиотеку DLL с помощью P / Invoke, а в Mac OSX целевое приложение C вызывает библиотеку DLL. У меня есть простые функции, которые прекрасно работают, но мне нужна новая функция, которая возвращает массив целых чисел.
Лучший пример, который я могу найти - это Маршал C ++ int для C # , и я смог заставить его работать. Однако я хотел бы изменить этот пример, чтобы вместо него передавать массив целых чисел в качестве ссылочного аргумента. Размер массива должен быть установлен во время выполнения.
Вот что я пробовал. PSize возвращается корректно, но список пуст.
В неуправляемом c ++:
bool GetList(__int32* list, __int32* pSize)
{
// Some dummy data
vector<int> ret;
ret.push_back(5);
ret.push_back(6);
list = (__int32*)malloc(ret.size());
for (unsigned int i = 0; i < ret.size(); i++)
{
list[i] = ret.at(i);
}
*pSize = ret.size();
return true;
}
В C #:
[DllImport(@"MyDll.dll",
CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern bool GetList(out IntPtr arrayPtr, out int size);
public static int[] GetList() {
IntPtr arrayValue = IntPtr.Zero;
int size = 0;
bool b = GetFrames(out arrayValue, out size);
// arrayValue is 0 here
int[] result = new int[size];
Marshal.Copy(arrayValue, result, 0, size);
return result;
}