我不得不使用外部DLL将数据发送到设备。我在DLL中使用的方法将指向字节数组的指针作为参数。当我使用C#时,我使用GCHandle.Alloc方法获取内存地址并将其分配给IntPtr实例。然后我传递IntPtr作为参数。我担心代码中可能存在内存泄漏风险,因为我之前没有在C#中使用指针和内存分配。代码目前如下所示:
GCHandle pinned = GCHandle.Alloc(byteArray, GCHAndleType.Pinned);
IntPtr arrayPtr = pinned.AddrOfPinnedObject();
var result = _externalDll.SendInfo(arrayPtr, byteArray.Length);
pinned.Free();
这是分配和使用IntPtr的正确方法吗?它似乎工作,但由于这将在生产机器上每天同时运行大约100次,我宁愿避免任何重大问题。
答案 0 :(得分:3)
通常,您需要使用 GCHandle 的唯一时间是非托管代码将保留对指针的引用以供以后使用。
这里你似乎只是传入指针,然后立即释放它。如果是这种情况,那么您根本不应该使用 GCHandle 。只需将第一个参数设为byte []并直接传递byteArray即可。运行时将负责在调用期间固定数组对象,并将指向数组的第一个元素的指针传递给非托管代码。