CLR 統合プログラミング モデルの制限事項

マネージド ストアド プロシージャまたはその他のマネージド データベース オブジェクトをビルドする場合、SQL Serverによって実行される特定のコード チェックは、データベースに初めて登録されたときに、ステートメントを使用して、実行時にもマネージド コード アセンブリに対してCREATE ASSEMBLYチェックを実行します。 マネージド コードが実行時にもチェックされるのは、実行時に決して到達しないコード パスがアセンブリに含まれる場合があるためです。 このチェックにより、サード パーティ アセンブリを柔軟に登録できます。特に、クライアント環境での実行を目的に作成され、ホストされた CLR では実行されない "安全でない" コードを含むアセンブリをブロックしないようにすることができるため、サード パーティ アセンブリに柔軟に対応できます。 マネージド コードが満たす必要がある要件は、アセンブリが 、、または UNSAFESAFE としてSAFEEXTERNAL_ACCESS最も厳密に登録されているかどうかによって異なります。以下に示します。

マネージド コード アセンブリには、制限事項に加えてコード セキュリティ権限も付与されます。 共通言語ランタイム (CLR) では、マネージド コードに対してコード アクセス セキュリティ (CAS) というセキュリティ モデルがサポートされます。 このモデルでは、コードの ID に基づいてアセンブリに権限が許可されます。 SAFEEXTERNAL_ACCESS、および UNSAFE の各アセンブリには、それぞれ異なる CAS 権限が付与されます。 詳細については、「 CLR 統合コード アクセス セキュリティ」を参照してください。

CREATE ASSEMBLY チェック

CREATE ASSEMBLY ステートメントを実行する際には、セキュリティ レベルごとに次のチェックが実行されます。 いずれかのチェックが失敗した場合、CREATE ASSEMBLY が失敗し、エラー メッセージが表示されます。

グローバル (すべてのセキュリティ レベル)

参照されるすべてのアセンブリは、次の条件のうち 1 つ以上を満たす必要があります。

  • 既にデータベースに登録されていること。

  • サポートされているアセンブリの 1 つであること。 詳細については、「サポートされている.NET Framework ライブラリ」を参照してください。

  • 場所を使用CREATE ASSEMBLY FROMしており、参照されているすべてのアセンブリとその依存関係を場所>で<使用できます。<>

  • バイト ...>を使用<CREATE ASSEMBLY FROMしており、すべての参照はスペースで区切られたバイトで指定されます。

EXTERNAL_ACCESS

すべての EXTERNAL_ACCESS アセンブリは、次の条件を満たす必要があります。

  • 静的フィールドが情報の格納に使用されていないこと。 読み取り専用の静的フィールドは許可されます。

  • PEVerify テストにパスしていること。 .NET Framework SDK には、MSIL コードと関連メタデータがタイプ セーフの要件を満たしていることをチェックするための PEVerify ツール (peverify.exe) が付属しています。

  • SynchronizationAttribute クラスなどによる同期が使用されていないこと。

  • ファイナライザー メソッドが使用されていないこと。

EXTERNAL_ACCESS アセンブリでは、次のカスタム属性が許可されません。

  • System.ContextStaticAttribute

  • System.MTAThreadAttribute

  • System.Runtime.CompilerServices.MethodImplAttribute

  • System.Runtime.CompilerServices.CompilationRelaxationsAttribute

  • System.Runtime.Remoting.Contexts.ContextAttribute

  • System.Runtime.Remoting.Contexts.SynchronizationAttribute

  • System.Runtime.InteropServices.DllImportAttribute

  • System.Security.Permissions.CodeAccessSecurityAttribute

  • System.Security.SuppressUnmanagedCodeSecurityAttribute

  • System.Security.UnverifiableCodeAttribute

  • System.STAThreadAttribute

  • System.ThreadStaticAttribute

SAFE

  • EXTERNAL_ACCESS アセンブリの条件がすべてチェックされていること。

ランタイム チェック

コード アセンブリは、実行時に次の条件をチェックされます。 これらの条件のいずれかが見つからなかった場合、マネージド コードの実行が失敗し、例外がスローされます。

UNSAFE

バイト配列から メソッドを呼び出すことによって明示的にアセンブリを System.Reflection.Assembly.Load() 読み込むか、名前空間を使用 Reflection.Emit して暗黙的に読み込むのは許可されません。

EXTERNAL_ACCESS

UNSAFE の条件がすべてチェックされていること。

サポートされているアセンブリの一覧の中で、次のホスト保護属性 (HPA) 値で注釈を付けられている型およびメンバーはすべて許可されません。

  • SelfAffectingProcessMgmt

  • SelfAffectingThreading

  • 同期

  • SharedState

  • ExternalProcessMgmt

  • ExternalThreading

  • SecurityInfrastructure

  • MayLeakOnAbort

  • UI

サポートされているアセンブリの HPA と許可されていない型とメンバーの一覧の詳細については、「 ホスト保護属性と CLR 統合プログラミング」を参照してください。

SAFE

EXTERNAL_ACCESS の条件がすべてチェックされていること。

参照

サポートされている .NET Framework ライブラリ
CLR 統合のコード アクセス セキュリティ
ホスト保護属性と CLR 統合プログラミング
アセンブリの作成