我是C#的新手,正在尝试与C ++ dll通信C#。我的主要目的是使用Marshal.AllocHGlobal()
在C#中分配内存,在其中分配值,并将IntPtr
的引用传递给C ++ dll。在C ++ dll方面,我正在使用malloc()
更改分配的内存大小,并分配变量。最后,我在C#中打印值。到目前为止,一切正常。
但是当我尝试使用Marshal.FreeHGlobal()
释放C#中分配的内存时,出现错误。
实际上,我在如何使用这些功能实现代码方面进行了大量研究。我找到了一个解决方案,说我必须在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))
答案 0 :(得分:3)
Marshal.FreeHGlobal()
无法释放使用C malloc()
函数分配的内存。内存必须“来自[[Marshal。] AllocHGlobal,[Marshal。] ReAllocHGlobal,或任何等效的非托管API方法”分配的全局堆。
内部,Marshal.AllocHGlobal()
和Marshal.FreeHGlobal()
使用Win32 LocalAlloc()
和LocalFree()
函数。在MSDN上有记录。
否则,如果您希望DLL根据需要分配内存,则必须使C#代码将分配的指针传递回DLL,以便可以正确释放它,即使用C free()
如果内存是用malloc()
分配的,则函数起作用。
如果两个模块彼此共享内存,但在公共内存管理器(例如操作系统提供的内存管理器)上不一致,则分配内存的模块必须是同一模块才能释放内存,因为唯一知道如何分配内存以及如何释放内存的模块。