1

ハンドルを返す非同期マネージ メソッドを呼び出すアンマネージ コードがあり、アンマネージ コードはそのハンドルを使用して待機します。ドキュメントによると、SafeWaitHandle には他に 2 つのメソッド (DangerousAddRefおよびDangerousRelease) が用意されています。ハンドルが解放されないようにするには、これらのメソッドを使用する必要がありますか? メソッドの名前が示すDangerousGetHandleように、何かに非常に注意する必要があるように思えます。ここで何がそんなに危険なのですか?

編集:このシナリオを実装するより良い方法はありますか (危険ではありません)?

4

2 に答える 2

2

マネージ メソッドがハンドルを返すが、ハンドルの所有権を呼び出し元のアンマネージ メソッドに渡さない場合は、ハンドルをSafeWaitHandle直接として返す必要があります (ハンドルにマーシャリングされます)。この方法では、アンマネージ コードはそうしません。ハンドルの解放を心配する必要があります。
ハンドルの所有権をアンマネージ メソッドに渡す場合は、ハンドルをDangerousAddRef返す前に呼び出す必要がありますが、アンマネージ コードを使用してハンドルを解放する必要があります。

于 2009-12-28T18:15:34.670 に答える
0

MSDNから:

DangerousGetHandle メソッドを使用すると、ハンドルが SetHandleAsInvalid で無効としてマークされている場合でも、DangerousGetHandle は元の古いハンドル値を返す可能性があるため、セキュリティ リスクが生じる可能性があります。返されたハンドルは、いつでもリサイクルできます。せいぜい、これはハンドルが突然機能しなくなる可能性があることを意味します。最悪の場合、ハンドルまたはハンドルが表すリソースが信頼されていないコードに公開されている場合、再利用または返されたハンドルに対するリサイクル セキュリティ攻撃が発生する可能性があります。

于 2009-12-24T08:00:27.673 に答える