このためのカスタム アクセス許可は実際には必要ありませんが、FileIOPermissionAttribute に似たカスタム属性が必要です。その CreatePermission メソッドで、属性に渡される SpecialFolder 値に対応する実際のフォルダー パスの FileIOPermission を作成できます。例(いくつかの検証を追加する必要があります):
[Serializable]
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Struct | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)]
public sealed class SpecialFolderIOPermissionAttribute : CodeAccessSecurityAttribute
{
private Environment.SpecialFolder _folder;
private FileIOPermissionAccess _access;
public SpecialFolderIOPermissionAttribute(SecurityAction action)
: base(action)
{
this.Unrestricted = true;
}
public Environment.SpecialFolder Folder
{
get
{
return this._folder;
}
set
{
this._folder = value;
this.Unrestricted = false;
}
}
public FileIOPermissionAccess Access
{
get
{
return this._access;
}
set
{
this._access = value;
this.Unrestricted = false;
}
}
public override IPermission CreatePermission()
{
FileIOPermission permission;
if (this.Unrestricted)
{
permission = new FileIOPermission(PermissionState.Unrestricted);
}
else
{
permission = new FileIOPermission(this.Access, Environment.GetFolderPath(this.Folder));
}
return permission;
}
}
ここで注意すべきことの 1 つは、Environment.GetFolderPath がターゲット フォルダーへの PathDiscovery アクセスを要求するため、CreatePermission メソッドでそのアクセス許可をアサートするかどうかを決定する必要があることです。(個人的には、BCL チームが最初に FileIOPermissionAttribute で特別なフォルダーのサポートを実装しなかった理由の 1 つは、これに関する複雑な問題ではないかと思います。)