このコードでは、ReadFileSystemメソッドがファイルシステムのアクセス許可をアサートすることを禁止したいと思います。CASでアサートを拒否する方法は?
これはfileIo.Assert()でスローされると予想しましたが、そうではありません。どうして? CASにここ
using System.Security.Permissions;
static void Main(string[] args)
{
var fileIo = new FileIOPermission(PermissionState.Unrestricted);
var secuPerm = new SecurityPermission(SecurityPermissionFlag.Assertion);
PermissionSet set = new PermissionSet(PermissionState.Unrestricted);
set.AddPermission(fileIo);
set.AddPermission(secuPerm);
set.Deny();
ReadFileSystem();
Console.Read();
}
private static void ReadFileSystem()
{
var fileIo = newFileIOPermission(PermissionState.Unrestricted);
fileIo.Assert();
DirectoryInfo dir = new DirectoryInfo("C:/");
dir.GetDirectories();
}
更新
グレートリンク:確かにhttp://blogs.msdn.com/shawnfa/archive/2004/08/25/220458.aspx
binarycoderはまさに正しいです。 .NETはめったに内部的にアサートしません...通常は要求します。デマンドは、スタック上を拒否して失敗するスタックが何をするのかを示します。すべてのファイルIOに対して.NETは要求を行います。しかし、スタック上にAssertが見つかるとすぐに、スタックウォークは短く止められます。 –
バイナリコーダが示唆しているように、Assertの作業を邪魔にならない唯一の方法は、アサートしようとしているパーミッションをアセンブリ全体で拒否し、アセンブリを部分的な信頼で効果的に実行させることです。部分的な信頼は良いですが、Assertを呼びたくない場合は、単に呼び出さないでください。 –
@Andrew、私はAssert後の呼び出しがハードドライブにアクセスできないようにしたいと思っていました。私のユースケースは、ロード時に証拠を設定することなく、リフレクション(信頼できない)を介して別のアセンブリを呼び出すことでした。最後に、私がやったことです。しかし、このCASの動作は興味をそそられました。 –