1

我有非托管代码调用返回句柄的异步托管方法,然后非托管代码使用该句柄等待。根据文档,SafeWaitHandle 提供了 2 种其他方法(DangerousAddRefDangerousRelease)。我应该使用这些方法来防止 Handle 不被释放吗?正如方法的名称所DangerousGetHandle暗示的那样,在我看来我应该非常小心一些东西,这里有什么危险?

编辑:有没有更好的方法来实现这个场景(不危险)?

4

2 回答 2

2

如果托管方法返回句柄,但没有将句柄的所有权传递给调用非托管方法,那么您应该SafeWaitHandle直接将句柄作为 a 返回(它将被编组为句柄) - 这样非托管代码不会不得不担心释放手柄。
如果要将句柄的所有权传递给非托管方法,则应DangerousAddRef在返回句柄之前调用,但必须使用非托管代码释放句柄。

于 2009-12-28T18:15:34.670 回答
0

来自MSDN

使用 DangerousGetHandle 方法可能会带来安全风险,因为如果句柄已被 SetHandleAsInvalid 标记为无效,DangerousGetHandle 仍会返回原始的、可能陈旧的句柄值。返回的句柄也可以在任何时候回收。充其量,这意味着手柄可能会突然停止工作。在最坏的情况下,如果句柄或句柄所代表的资源暴露给不受信任的代码,这可能会导致对重用或返回的句柄的回收安全攻击。

于 2009-12-24T08:00:27.673 回答