如何正确处理 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
)
我有需要调用 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
)