如何正确处理 pinvoke/unmanaged 代码

How to properly dispose of pinvoke/unmanaged code

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

仔细阅读这些内容,我似乎应该使用安全句柄。伟大的。除了我的 dll 没有 return 任何句柄或 intptr。那么现在怎么办?

签名大体如下:

HRESULT _XYZFN XYZNewTrip (Trip *pTripID); 

Argument Values:

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

我能告诉我鞋拔是如何安全处理的吗?这似乎是这个 article 中的难题。

如果它没有 return 句柄,那么显然您不能释放任何东西,因此 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,因此您可以使用 Wrapping Unmanaged Resources - Defining Level 0指针类型(中间情况)

  • 您的代码是 x86 和 x64:Wrapping Unmanaged Resources - Defining Level 0 Types for Non-Pointer Data (The Hard Case) :-( (而不是 ushort 你有 int)