SafeHandle クラス
アセンブリ: mscorlib (mscorlib.dll 内)

Public MustInherit Class SafeHandle Inherits CriticalFinalizerObject Implements IDisposable
public abstract class SafeHandle : CriticalFinalizerObject, IDisposable
public abstract class SafeHandle extends CriticalFinalizerObject implements IDisposable
public abstract class SafeHandle extends CriticalFinalizerObject implements IDisposable

SafeHandle クラスを使用すると、ハンドルのリサイクルによるセキュリティ攻撃から保護できます。また、このクラスはハンドル リソースの重大な終了処理も行います。このクラスを使用すると、派生クラスのインスタンスでラップされたアンマネージ リソースを識別するハンドル (オペレーティング システム ハンドルなど) をアンマネージ コードに渡すことができます。このクラスによって、ハンドルのリサイクルによるセキュリティ攻撃から保護できます。ハンドルのリサイクルの一例として、ハンドルの信頼関係のないユーザーが、あるスレッドのハンドルを閉じ、別のスレッドのリソースに対する操作をキューに配置しようとする場合が挙げられます。この信頼関係のないユーザーは、プロセス内の無関係なスレッドによってハンドルがすぐに再利用されることを期待してこれを実行します。また、インプロセス操作によって、呼び出し元が通常はアクセスできないデータが返されたり、変更されたりします。SafeHandle は、重大な終了処理も行います。ホストによって AppDomain がアンロードされた場合や、通常のファイナライザがブロックしたり、クリーンアップに時間がかかりすぎている場合でも、ReleaseHandle メソッドが実行されます。
汎用ハンドルを作成することはできないため、このクラスは抽象クラスです。SafeHandle を実装するには、オペレーティング システム ハンドルの型ごとに派生クラスを作成する必要があります。SafeHandle の派生クラスを作成するには、オペレーティング システム ハンドルを作成し、解放する方法を把握している必要があります。CloseHandle を使用する場合もあれば、UnmapViewOfFile や FindClose などの特定のメソッドを使用する場合もあるため、このプロセスはハンドルの型ごとに異なります。このため、オペレーティング システム ハンドルの型 (SafeRegistryHandle、SafeFileHandle、MySpecialSafeFileHandle など) ごとに、SafeHandle の派生クラスを作成する必要があります。これらの派生クラスの一部は、Microsoft.Win32.SafeHandles 名前空間にあらかじめ作成され提供されています。
![]() |
---|
SafeHandle から派生した独自のクラスの作成は高度なプログラミング技術です。SafeHandle から派生した作成済みの一連のクラスは、抽象派生クラスとして提供され、Microsoft.Win32.SafeHandles 名前空間にあります。これらのクラスは、ファイル ハンドルとオペレーティング システム ハンドルをサポートする共通機能を提供するように設計されています。 |

SafeHandle クラスを実装する方法を次のコード例に示します。
using System; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using System.Runtime.ConstrainedExecution; namespace SafeHandleExample { sealed class MySafeHandleSubclass : SafeHandle { // Called by P/Invoke when returning SafeHandles private MySafeHandleSubclass() : base(IntPtr.Zero, true) { } // If & only if you need to support user-supplied handles internal MySafeHandleSubclass(IntPtr preexistingHandle, bool ownsHandle) : base(IntPtr.Zero, ownsHandle) { SetHandle(preexistingHandle); } // Do not provide a finalizer - SafeHandle's critical finalizer will // call ReleaseHandle for you. public override bool IsInvalid { get { return IsClosed || handle == IntPtr.Zero; } } [DllImport("kernel32")] [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] private static extern bool CloseHandle(IntPtr handle); protected override bool ReleaseHandle() { return CloseHandle(handle); } [DllImport("kernel32")] public static extern MySafeHandleSubclass CreateHandle(int someState); } class Class1 { [STAThread] static void Main(string[] args) { bool ownsHandle = true; MySafeHandleSubclass s = new MySafeHandleSubclass(IntPtr.Zero, ownsHandle); } } }

- SecurityPermission (アンマネージ コードを操作するために必要なアクセス許可)UnmanagedCode (関連する列挙体)

System.Runtime.ConstrainedExecution.CriticalFinalizerObject
System.Runtime.InteropServices.SafeHandle
Microsoft.Win32.SafeHandles.SafeHandleMinusOneIsInvalid
Microsoft.Win32.SafeHandles.SafeHandleZeroOrMinusOneIsInvalid


Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


SafeHandle クラス
アセンブリ: mscorlib (mscorlib.dll 内)

Public MustInherit Class SafeHandle Implements IDisposable
public abstract class SafeHandle : IDisposable
public abstract class SafeHandle implements IDisposable
public abstract class SafeHandle implements IDisposable

System.Security.Cryptography.RandomNumberGenerator
System.Security.Cryptography.SafeHandle


Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


SafeHandle コンストラクタ
アセンブリ: mscorlib (mscorlib.dll 内)

Dim invalidHandleValue As IntPtr Dim ownsHandle As Boolean Dim instance As New SafeHandle(invalidHandleValue, ownsHandle)


ownsHandle パラメータが false の場合、ReleaseHandle が呼び出されることはありません。したがって、コードがリソースをリークする可能性があるため、このパラメータ値を使用することはお勧めしません。

- SecurityPermission (アンマネージ コードを呼び出すために必要なアクセス許可)。 UnmanagedCode (関連する列挙体)。LinkDemand (セキュリティ アクション)。

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


SafeHandle コンストラクタ
アセンブリ: mscorlib (mscorlib.dll 内)

Dim invalidHandleValue As IntPtr Dim ownsHandle As Boolean Dim instance As New SafeHandle(invalidHandleValue, ownsHandle)
パラメータ
- invalidHandleValue
- ownsHandle

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


SafeHandle フィールド
SafeHandle フィールド
SafeHandle プロパティ
SafeHandle プロパティ
SafeHandle メソッド

名前 | 説明 | |
---|---|---|
![]() | Close | リソースを解放するためのハンドルをマークします。 |
![]() | DangerousAddRef | SafeHandle インスタンスの参照カウンタを手動でインクリメントします。 |
![]() | DangerousGetHandle | handle フィールドの値を返します。 |
![]() | DangerousRelease | SafeHandle インスタンスの参照カウンタを手動でデクリメントします。 |
![]() | Dispose | オーバーロードされます。 SafeHandle クラスが使用しているリソースを解放します。 |
![]() | Equals | オーバーロードされます。 2 つの Object インスタンスが等しいかどうかを判断します。 ( Object から継承されます。) |
![]() | GetHashCode | 特定の型のハッシュ関数として機能します。GetHashCode は、ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用に適しています。 ( Object から継承されます。) |
![]() | GetType | 現在のインスタンスの Type を取得します。 ( Object から継承されます。) |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 ( Object から継承されます。) |
![]() | SetHandleAsInvalid | 今後は使用しないものとしてハンドルをマークします。 |
![]() | ToString | 現在の Object を表す String を返します。 ( Object から継承されます。) |

名前 | 説明 | |
---|---|---|
![]() | Dispose | オーバーロードされます。 SafeHandle クラスが使用しているリソースを解放します。 |
![]() | Finalize | オーバーライドされます。 ハンドルに関連付けられたすべてのリソースを解放します。 |
![]() | MemberwiseClone | 現在の Object の簡易コピーを作成します。 ( Object から継承されます。) |
![]() | ReleaseHandle | 派生クラスでオーバーライドされると、ハンドルを解放するために必要なコードを実行します。 |
![]() | SetHandle | ハンドルを指定した既存のハンドルに設定します。 |

SafeHandle メソッド

名前 | 説明 | |
---|---|---|
![]() | Equals | オーバーロードされます。 2 つの Object インスタンスが等しいかどうかを判断します。 ( Object から継承されます。) |
![]() | GetHashCode | 特定の型のハッシュ関数として機能します。GetHashCode は、ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用に適しています。 ( Object から継承されます。) |
![]() | GetType | 現在のインスタンスの Type を取得します。 ( Object から継承されます。) |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 ( Object から継承されます。) |
![]() | ToString | 現在の Object を表す String を返します。 ( Object から継承されます。) |


SafeHandle メンバ
オペレーティング システム ハンドルのラッパー クラスを表します。
SafeHandle データ型で公開されるメンバを以下の表に示します。




名前 | 説明 | |
---|---|---|
![]() | Close | リソースを解放するためのハンドルをマークします。 |
![]() | DangerousAddRef | SafeHandle インスタンスの参照カウンタを手動でインクリメントします。 |
![]() | DangerousGetHandle | handle フィールドの値を返します。 |
![]() | DangerousRelease | SafeHandle インスタンスの参照カウンタを手動でデクリメントします。 |
![]() | Dispose | オーバーロードされます。 SafeHandle クラスが使用しているリソースを解放します。 |
![]() | Equals | オーバーロードされます。 2 つの Object インスタンスが等しいかどうかを判断します。 (Object から継承されます。) |
![]() | GetHashCode | 特定の型のハッシュ関数として機能します。GetHashCode は、ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用に適しています。 (Object から継承されます。) |
![]() | GetType | 現在のインスタンスの Type を取得します。 (Object から継承されます。) |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 (Object から継承されます。) |
![]() | SetHandleAsInvalid | 今後は使用しないものとしてハンドルをマークします。 |
![]() | ToString | 現在の Object を表す String を返します。 (Object から継承されます。) |

名前 | 説明 | |
---|---|---|
![]() | Dispose | オーバーロードされます。 SafeHandle クラスが使用しているリソースを解放します。 |
![]() | Finalize | オーバーライドされます。 ハンドルに関連付けられたすべてのリソースを解放します。 |
![]() | MemberwiseClone | 現在の Object の簡易コピーを作成します。 (Object から継承されます。) |
![]() | ReleaseHandle | 派生クラスでオーバーライドされると、ハンドルを解放するために必要なコードを実行します。 |
![]() | SetHandle | ハンドルを指定した既存のハンドルに設定します。 |

SafeHandle メンバ
SafeHandle データ型で公開されるメンバを以下の表に示します。

名前 | 説明 | |
---|---|---|
![]() | SafeHandle |


名前 | 説明 | |
---|---|---|
![]() | IsInvalid |

名前 | 説明 | |
---|---|---|
![]() | Equals | オーバーロードされます。 2 つの Object インスタンスが等しいかどうかを判断します。 (Object から継承されます。) |
![]() | GetHashCode | 特定の型のハッシュ関数として機能します。GetHashCode は、ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用に適しています。 (Object から継承されます。) |
![]() | GetType | 現在のインスタンスの Type を取得します。 (Object から継承されます。) |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 (Object から継承されます。) |
![]() | ToString | 現在の Object を表す String を返します。 (Object から継承されます。) |


- SafeHandleのページへのリンク