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); } } }


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 によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


Weblioに収録されているすべての辞書からSafeHandle クラスを検索する場合は、下記のリンクをクリックしてください。

- SafeHandle クラスのページへのリンク