简体   繁体   中英

How to properly dispose of pinvoke/unmanaged code

I have code that needs to pinvoke ac dll, it seems to me that this code should implement idisposible since it touches unmanaged code. I could be wrong so please correct me if this is not true.

Reading up on the stuff it seems like I should use safehandles. Great. Except my dll doesn't return any handles, or intptr. So now what?

The signatures are mostly like the following:

 HRESULT _XYZFN XYZNewTrip (Trip *pTripID); 

Argument Values:

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

Can I some how shoehorn a safehandle in there? It seems like maybe the hard case from this article .

If it doesn't return an handle, then clearly you can't deallocate anything, so the IDisposable pattern would be useless.

Only thing:

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

These pTripID how will you deallocate them? Probably there is a

void XYZFreeTrip(Trip tripID);

In this case, you'll have to collect all the tripID you get and free them in the IDisposable .

Now if Trip is an handle, then you have two options:

  • Your code is x86 only (because for example the PInvoke DLL is x86 only): sizeof(int) == sizeof(int*) == IntPtr.Size , so you can use the Wrapping Unmanaged Resources - Defining Level 0 Types for Pointers (The Intermediate Case)

  • Your code is x86 and x64: the Wrapping Unmanaged Resources - Defining Level 0 Types for Non-Pointer Data (The Hard Case) :-( (instead of ushort you have a int )

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM