Я новичок в C # и пытаюсь общаться C # с C ++ dll. Моя основная цель - выделить память в C # с помощью Marshal.AllocHGlobal()
, присвоить ей значения и передать ссылку на IntPtr
в C ++ dll. На стороне C ++ dll я меняю выделенный объем памяти с помощью malloc()
, назначаю переменные. В конце я печатаю значения в C #. До этого момента все отлично работает.
Но когда я пытаюсь освободить выделенную память в C # с помощью Marshal.FreeHGlobal()
, я получаю ошибку.
На самом деле, я много ищу, как мне реализовать свой код с этими функциями. Я нашел решение, которое говорит, что я должен написать функцию в DLL для освобождения памяти и вызвать эту функцию. Но мой менеджер сказал мне, мне нужно сделать эту работу на стороне C #. Поэтому я не могу использовать это решение. Кроме того, я нашел некоторые другие идеи, которые используют COM, но менеджер не хочет использовать COM. Поэтому я не могу использовать COM. Вот некоторые коды;
Распределение памяти в C #
var offset = 0;
var size = Marshal.SizeOf(typeof(dVehicle)) * denemeVehicle.Count();
IntPtr vehPnt;
vehPnt = Marshal.AllocHGlobal(size);
for(var i = 0; i < denemeVehicle.Count(); i++)
{
Marshal.StructureToPtr(denemeVehicle[i], new IntPtr(vehPnt.ToInt64() + offset), false);
offset += Marshal.SizeOf(typeof(dVehicle));
}
Изменение размера выделенной памяти в C ++
*vehicles = (dVehicle*) malloc(sizeof(dVehicle) * (new_VehSize));
Освободить выделенную память
Marshal.FreeHGlobal(vehPnt); // The error shows up in here
А это сообщение об ошибке;
Указатель недействителен. (Исключение из HRESULT: 0x80070006 (E_HANDLE))