您实际上不需要为此自定义权限,但您确实需要类似于 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;
}
}
这里要注意的一件事是 Environment.GetFolderPath 将要求对目标文件夹进行 PathDiscovery 访问,因此您必须决定是否要在 CreatePermission 方法中声明该权限。(就个人而言,我怀疑这方面的复杂性可能是 BCL 团队一开始没有在 FileIOPermissionAttribute 中实现特殊文件夹支持的原因之一。)