1

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

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

签名大多如下:

HRESULT _XYZFN XYZNewTrip (Trip *pTripID); 

参数值:

pTripID:指向一个 4 字节整数的指针,新的行程句柄将被放置在其中

我可以在里面塞一个安全把手吗?从这篇文章看来,这可能是个难题。

4

1 回答 1

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因此您可以使用Wrapping Unmanaged Resources - Defining Level 0 Types for Pointers (The Intermediate Case)

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

于 2015-05-01T18:12:03.427 回答