SafeHandleとは? わかりやすく解説

SafeHandle クラス

メモ : このクラスは、.NET Framework version 2.0 で新しく追加されたものです。

オペレーティング システム ハンドルのラッパー クラスを表します。

名前空間: System.Runtime.InteropServices
アセンブリ: mscorlib (mscorlib.dll 内)
構文構文

Public MustInherit Class
 SafeHandle
    Inherits CriticalFinalizerObject
    Implements IDisposable
public abstract class SafeHandle : CriticalFinalizerObject,
 IDisposable
public ref class SafeHandle abstract : public
 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 から継承する場合は、IsInvalid および ReleaseHandle の両メンバをオーバーライドする必要があります。 また、無効なハンドル値を表す値と、マネージ コードでネイティブ ハンドルを所有するかどうかを示すブール値を持つ、基本コンストラクタを呼び出す既定のコンストラクタを提供することも必要です。

使用例使用例

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);
        }
    }
}
.NET Framework のセキュリティ.NET Framework のセキュリティ
継承階層継承階層
System.Object
   System.Runtime.ConstrainedExecution.CriticalFinalizerObject
    System.Runtime.InteropServices.SafeHandle
       Microsoft.Win32.SafeHandles.SafeHandleMinusOneIsInvalid
       Microsoft.Win32.SafeHandles.SafeHandleZeroOrMinusOneIsInvalid
スレッド セーフスレッド セーフ
この型の public static (Visual Basic では Shared) メンバはすべて、スレッド セーフです。インスタンス メンバの場合は、スレッド セーフであるとは限りません。
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照
関連項目
SafeHandle メンバ
System.Runtime.InteropServices 名前空間
Microsoft.Win32.SafeHandles
CriticalHandle クラス
CriticalFinalizerObject クラス

SafeHandle クラス

名前空間: System.Security.Cryptography
アセンブリ: mscorlib (mscorlib.dll 内)
構文構文

Public MustInherit Class
 SafeHandle
    Implements IDisposable
public abstract class SafeHandle implements
 IDisposable
public abstract class SafeHandle implements
 IDisposable
継承階層継承階層
System.Object
   System.Security.Cryptography.RandomNumberGenerator
    System.Security.Cryptography.SafeHandle
スレッド セーフスレッド セーフ
この型の public static (Visual Basic では Shared) メンバはすべて、スレッド セーフです。インスタンス メンバの場合は、スレッド セーフであるとは限りません。
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照
関連項目
SafeHandle メンバ
System.Security.Cryptography 名前空間

SafeHandle コンストラクタ

メモ : このコンストラクタは、.NET Framework version 2.0 で新しく追加されたものです。

指定した無効なハンドル値を使用して、SafeHandle クラスの新しいインスタンスを初期化します。

名前空間: System.Runtime.InteropServices
アセンブリ: mscorlib (mscorlib.dll 内)
構文構文

Protected Sub New ( _
    invalidHandleValue As IntPtr, _
    ownsHandle As Boolean _
)
Dim invalidHandleValue As IntPtr
Dim ownsHandle As Boolean

Dim instance As New SafeHandle(invalidHandleValue,
 ownsHandle)
protected SafeHandle (
    IntPtr invalidHandleValue,
    bool ownsHandle
)
protected:
SafeHandle (
    IntPtr invalidHandleValue, 
    bool ownsHandle
)
protected SafeHandle (
    IntPtr invalidHandleValue, 
    boolean ownsHandle
)
protected function SafeHandle (
    invalidHandleValue : IntPtr, 
    ownsHandle : boolean
)

パラメータ

invalidHandleValue

無効なハンドルの値 (通常は 0 または -1)。IsInvalid の実装では、この値に対して true を返す必要があります。

ownsHandle

終了処理中に SafeHandle によってハンドルを確実に解放する場合は true。それ以外の場合は false (お勧めしません)。

例外例外
解説解説

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

.NET Framework のセキュリティ.NET Framework のセキュリティ
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照
関連項目
SafeHandle クラス
SafeHandle メンバ
System.Runtime.InteropServices 名前空間

SafeHandle コンストラクタ

名前空間: System.Security.Cryptography
アセンブリ: mscorlib (mscorlib.dll 内)
構文構文

Protected Sub New ( _
    invalidHandleValue As IntPtr, _
    ownsHandle As Boolean _
)
Dim invalidHandleValue As IntPtr
Dim ownsHandle As Boolean

Dim instance As New SafeHandle(invalidHandleValue,
 ownsHandle)
protected SafeHandle (
    IntPtr invalidHandleValue,
    bool ownsHandle
)
protected:
SafeHandle (
    IntPtr invalidHandleValue, 
    bool ownsHandle
)
protected SafeHandle (
    IntPtr invalidHandleValue, 
    boolean ownsHandle
)
protected function SafeHandle (
    invalidHandleValue : IntPtr, 
    ownsHandle : boolean
)

パラメータ

invalidHandleValue
ownsHandle
プラットフォームプラットフォーム
バージョン情報バージョン情報

.NET Compact Framework

サポート対象 : 2.0
参照参照

関連項目

SafeHandle クラス
SafeHandle メンバ
System.Security.Cryptography 名前空間

SafeHandle フィールド


プロテクト フィールドプロテクト フィールド

参照参照

関連項目

SafeHandle クラス
System.Runtime.InteropServices 名前空間
Microsoft.Win32.SafeHandles
CriticalHandle クラス
CriticalFinalizerObject クラス

SafeHandle フィールド


プロテクト フィールドプロテクト フィールド

  名前 説明
プロテクト フィールド handle  
参照参照

関連項目

SafeHandle クラス
System.Security.Cryptography 名前空間

SafeHandle プロパティ


パブリック プロパティパブリック プロパティ

  名前 説明
パブリック プロパティ IsClosed ハンドルが閉じているかどうかを示す値を取得します。
パブリック プロパティ IsInvalid 派生クラスでオーバーライドされると、ハンドル値が無効かどうかを示す値を取得します。
参照参照

関連項目

SafeHandle クラス
System.Runtime.InteropServices 名前空間
Microsoft.Win32.SafeHandles
CriticalHandle クラス
CriticalFinalizerObject クラス

SafeHandle プロパティ


パブリック プロパティパブリック プロパティ

  名前 説明
パブリック プロパティ IsInvalid  
参照参照

関連項目

SafeHandle クラス
System.Security.Cryptography 名前空間

SafeHandle メソッド


パブリック メソッドパブリック メソッド

プロテクト メソッドプロテクト メソッド
参照参照

関連項目

SafeHandle クラス
System.Runtime.InteropServices 名前空間
Microsoft.Win32.SafeHandles
CriticalHandle クラス
CriticalFinalizerObject クラス

SafeHandle メソッド


SafeHandle メンバ

オペレーティング システム ハンドルのラッパー クラスを表します。

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


プロテクト コンストラクタプロテクト コンストラクタ
プロテクト フィールドプロテクト フィールド
パブリック プロパティパブリック プロパティ
  名前 説明
パブリック プロパティ IsClosed ハンドルが閉じているかどうかを示す値を取得します。
パブリック プロパティ IsInvalid 派生クラスでオーバーライドされると、ハンドル値が無効かどうかを示す値を取得します。
パブリック メソッドパブリック メソッド
プロテクト メソッドプロテクト メソッド
参照参照

関連項目

SafeHandle クラス
System.Runtime.InteropServices 名前空間
Microsoft.Win32.SafeHandles
CriticalHandle クラス
CriticalFinalizerObject クラス

SafeHandle メンバ




英和和英テキスト翻訳

英語⇒日本語日本語⇒英語

辞書ショートカット

すべての辞書の索引

「SafeHandle」の関連用語

SafeHandleのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



SafeHandleのページの著作権

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2026 Microsoft.All rights reserved.

©2026 GRAS Group, Inc.RSS