宣言セキュリティ属性の出力方法
動的アセンブリおよびその型とメソッドに宣言セキュリティ属性を出力することは、機能的には Ilasm.exe (MSIL アセンブラー) に対して .permission 宣言および .permissionset 宣言をコーディングすること、または Visual Basic、C#、C++ の各ソース コードに PermissionSetAttribute 属性を適用することと同等です。 ただし、出力された属性を格納するために使用するメタデータ形式と、コンパイルされた属性を格納するために使用する形式との間には、.NET Framework のバージョンによって差異があります。
宣言セキュリティのメタデータ形式
元の XML 形式に加えて、ECMA 規格の 2005 年リビジョンから、宣言セキュリティ属性を格納するための新しいメタデータ形式が導入されました。 詳細については、ECMA Partition II ドキュメントの DeclSecurity 表にある PermissionSet BLOB (2005 年リビジョンのセクション 22.11) の説明を参照してください。 このドキュメントはオンラインで入手できます。MSDN の「ECMA C# and Common Language Infrastructure Standards (ECMA C# および共通言語基盤 (CLI: Common Language Infrastructure) 規格)」および ECMA International Web サイトの「Standard ECMA-335 - Common Language Infrastructure (CLI) (標準の EMCA-335: 共通言語基盤 (CLI: Common Language Infrastructure))」を参照してください。
.NET Framework のすべてのバージョンで、リフレクション出力を使用して適用された宣言セキュリティは、古いメタデータ形式で格納されます。
Ilasm.exe (MSIL アセンブラー) および .NET Framework Version 2.0 の言語コンパイラを使用してコンパイルされたコード内の宣言セキュリティ アクセス許可は、新しい形式で格納されます。
Ilasm.exe (MSIL アセンブラー) および .NET Framework Version 1.0 および 1.1 の言語コンパイラを使用してコンパイルされたコード内の宣言セキュリティ アクセス許可は、古い形式で格納されます。
宣言セキュリティ属性の出力方法
宣言セキュリティ属性は、アセンブリ、型、メソッド、およびコンストラクターに対して出力できます。 他のすべてのメンバー型については、宣言セキュリティは、基になるメソッドに対して出力されます。
重要 |
---|
PermissionSetAttribute オブジェクトを作成し、それを SetCustomAttribute メソッドを使用して動的なアセンブリ、型、またはメソッドに適用する方法では、宣言セキュリティ属性を出力できません。 |
動的なアセンブリに対して宣言セキュリティを出力するためには、必須、オプション、および拒否のアクセス許可を持つ個別の PermissionSet オブジェクトを作成します。 これらのアクセス許可セットを DefineDynamicAssembly メソッドの適切なオーバーロードに渡します。 カテゴリに適用するアクセス許可がない場合は、パラメーターに null を指定します。
重要 必須、オプション、および拒否のアクセス許可は、動的アセンブリが保存され、メモリ内に再度読み込まれるまで、または証拠および要求されたアクセス許可を指定する DefineDynamicAssembly メソッドのオーバーロードを使用し、Evidence オブジェクトを指定するまでは使用されません。詳細については、DefineDynamicAssembly のトピックを参照してください。
型、メソッド、およびコンストラクターに対して宣言セキュリティを出力するには、適用する各 SecurityAction に対するアクセス許可を持つ PermissionSet オブジェクトを作成します。 型には、TypeBuilder の AddDeclarativeSecurity メソッドを、コンストラクターには ConstructorBuilder の AddDeclarativeSecurity メソッドを、メソッドには MethodBuilder の AddDeclarativeSecurity メソッドを使用して、そのアクセス許可を適用します。
メモ 宣言セキュリティは、DynamicMethod クラスを使用して定義された動的メソッドについてはサポートされません。
他のすべてのプロパティおよびイベントに対して宣言セキュリティを適用するには、MethodBuilder の AddDeclarativeSecurity メソッドを使用して、基になるメソッドに目的のアクセス許可セットを適用します。 たとえば、プロパティに対して宣言セキュリティを出力するには、そのプロパティの get アクセサー メソッドおよび set アクセサー メソッドに宣言セキュリティを適用します。
動的アセンブリを出力するコードの開発中は、証拠およびアクセス許可を指定する DefineDynamicAssembly メソッドのオーバーロードを使用し、その動的アセンブリに適用する証拠を指定し、refusedPermissions に SecurityPermissionFlag.SkipVerification を含めることをお勧めします。 SkipVerification を拒否することにより、MSIL が必ず検証されるようにできます。 この手法では、完全な信頼が要求されるコードと共に使用すると、SecurityException もスローされるという制約があります。