宣言セキュリティのサポートの追加
厳密に要求されるわけではありませんが、要求、確認要求、アサーションなどのセキュリティ アクションを実行するための宣言構文でカスタム アクセス許可を指定できるように、それらのカスタム アクセス許可で宣言セキュリティをサポートする必要があります。 実際、アクセス許可の要求、リンク確認要求、継承確認要求は宣言的にしか行うことができません。 このため、カスタムのコード アクセス許可は、宣言セキュリティをサポートしない限り、リンク確認要求や継承確認要求によって要求または使用することはできません。 ここでは、カスタム アクセス許可で宣言セキュリティをサポートできるようにする Attribute クラスの実装方法について説明します。
注意
カスタム アクセス許可の属性バージョンは、自身を参照しているアセンブリ以外のアセンブリで定義されている必要があります。カスタム アクセス許可もそのアセンブリで定義されている必要があります。宣言セキュリティでは、これが必須です。属性はアセンブリが読み込まれるときに実行され、参照が発生した時点で属性が作成されていない場合があるためです。宣言によるアクセス許可が定義されているアセンブリ内でそのアクセス許可を使用すると、TypeLoadException がスローされます。
宣言用のセキュリティ属性は、直接または間接的に SecurityAttribute クラスから派生していることが必要です。 アクセス許可がコード アクセス許可である場合、属性クラスは SecurityAttribute から派生した CodeAccessSecurityAttribute から派生します。 セキュリティ属性クラスは、関連付けられたカスタム アクセス許可からアクセス許可オブジェクトのインスタンスを作成する CreatePermission メソッドを実装する必要があります。 この関連付けられたカスタム アクセス許可クラスは、コンパイラでシリアル化してメタデータに格納できるように、SerializableAttribute でマークする必要があります。 詳細については、「カスタム アクセス許可の実装」を参照してください。
CustomPermission という Boolean 型のアクセス許可用の属性クラスを実装するコードを次に示します。 この例では、アクセス許可クラスには、その状態を格納する Boolean 型の Unrestricted プロパティが 1 つだけあります。
<AttributeUsageAttribute(AttributeTargets.All, AllowMultiple := True)> Public Class
CustomPermissionAttribute
Inherits CodeAccessSecurityAttribute
Private myUnrestricted As Boolean = False
Public Shadows Property Unrestricted() As Boolean
Get
Return myUnrestricted
End Get
Set
myUnrestricted = value
End Set
End Property
Public Sub New(action As SecurityAction)
MyBase.New(action)
End Sub
Public Overrides Function CreatePermission() As IPermission
If Unrestricted Then
Return New CustomPermission(PermissionState.Unrestricted)
Else
Return New CustomPermission(PermissionState.None)
End If
End Function
End Class
[AttributeUsageAttribute(AttributeTargets.All, AllowMultiple = true)]
public class CustomPermissionAttribute: CodeAccessSecurityAttribute
{
bool unrestricted = false;
public new bool Unrestricted
{
get{ return unrestricted; }
set{ unrestricted = value; }
}
public CustomPermissionAttribute(SecurityAction action): base (action)
{
}
public override IPermission CreatePermission()
{
if(Unrestricted)
{
return new CustomPermission(PermissionState.Unrestricted);
}
else
{
return new CustomPermission(PermissionState.None);
}
}
}
この例の CreatePermission は、内部の Unrestricted プロパティをチェックし、CustomPermission オブジェクトの適切なインスタンスを作成します。 この例で使用されるプロパティは Unrestricted だけですが、カスタム アクセス許可用の他の属性クラスでは、関連するアクセス許可オブジェクトがサポートする状態をすべてサポートする必要があります。
CustomPermissionAttribute の使用例を次の確認要求宣言で示します。
<CustomPermissionAttribute(SecurityAction.Demand, Unrestricted := true)>
[CustomPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]