如何正确处理pinvoke /非托管代码

时间:2015-05-01 18:07:59

标签: c# c pinvoke safehandle

我有需要pinvoke c dll的代码,在我看来,这个代码应该实现idisposible,因为它触及非托管代码。我可能是错的,如果不是这样,请纠正我。

阅读这些东西似乎我应该使用安全手柄。大。除了我的DLL没有返回任何句柄,或intptr。那么现在怎么办?

签名大致如下:

HRESULT _XYZFN XYZNewTrip (Trip *pTripID); 
     

参数值:

     

pTripID:指向新的Trip句柄所在的4字节整数的指针   放置

我可以在那里找到一个安全的鞋帮吗?看起来这可能是article的难题。

1 个答案:

答案 0 :(得分:3)

如果它没有返回一个句柄,那么显然你不能释放任何东西,所以IDisposable模式将是无用的。

唯一的事:

pTripID: pointer to a 4 byte integer in which the new Trip handle will be placed

这些pTripID你将如何解除分配?可能有一个

void XYZFreeTrip(Trip tripID);

在这种情况下,您必须收集所有tripID,并在IDisposable中释放它们。

现在,如果Trip是句柄,那么您有两个选择:

  • 您的代码仅为x86(因为例如PInvoke DLL仅为x86):sizeof(int) == sizeof(int*) == IntPtr.Size,因此您可以使用包装非托管资源 - 为指针定义0级类型(中级)情况下)

  • 您的代码是x86和x64:包装非托管资源 - 为非指针数据定义0级类型(硬案例) :-((而不是ushort你有一个int