4

我必须使用外部 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 次,我宁愿避免任何重大问题。

4

1 回答 1

3

通常,您需要使用GCHandle的唯一时间是非托管代码将保留对您的指针的引用以供以后使用。

在这里,您似乎只是在传递指针,然后立即释放它。如果是这种情况,那么您根本不应该使用GCHandle。只需将您的第一个参数设为 byte[] 并直接传递 byteArray 即可。运行时将在调用期间负责固定数组对象,并将指向数组第一个元素的指针传递给非托管代码。

于 2013-03-13T14:57:40.697 回答