В примере SimplePermissionCodeRequest вначале
запрашивается разрешение на доступ к файлу.
Если в ответ на этот запрос общеязыковая
среда выполнения CLR разрешения не дает, то
внутри конструктора файлов она запускает
исключение SecurityException. Впрочем, сперва код
сам проверяет, есть ли у него это разрешение.
Если разрешения у кода нет, то он и не
пытается получить доступ к файлу, а просто
возвращает управление вызвавшей его
программе.
Обычно такое действие является
излишним, потому что общеязыковая среда
выполнения CLR будет предъявлять свое
требование внутри конструктора, но часто
вам бывает нужно проверить разрешения
перед выполнением некоторого кода, чтобы
static int Main() {
String *filename = ".\\read.txt"; // Строка
String *fileWithFullPath = // Строка
Path::GetFullPath(filename); // имя файла
try
{
FilelOPermission *fileIOPerm =
new FilelOPermission(
FilelOPermissionAccess::AllAccess, fileWithFullPath);
fileIOPerm->Demand(); // Запрос }
catch(Exception *e) // Исключение {
Console::WriteLine(e->Message); // Сообщение return
1; } try
{
Filelnfo *file = new Filelnfo(filename); // имя файла
StreamReader *sr = file->OpenText(); // файл
String *text; // Строка
text = sr->ReadLine();
while (text != 0)
// пока (текст! = 0)
{
Console::WriteLine(text); // текст text = sr->ReadLine();
// текст
}
sr->Close(); }
catch(Exception *e) // Исключение {
Console::WriteLine(e->Message); // Сообщение }
return 0; }
Даже если у кода есть разрешение
на чтение, полученное от общеязыковой среды
выполнения CLR, у пользователя все равно
должно быть разрешение на чтение от
файловой системы. Если у пользователя
такого разрешения нет, то при вызове метода
OpenText будет запущено исключение
UnauthorizedAccessException (Исключение Unau-IhorizedAccess, т.е.
Исключение несанкционированного доступа).
Будьте внимательны, когда нужно
передать коду в других сборках объекты,
прошедшие проверку на безопасность в своих
конструкторах. Поскольку проверка
выполнена в конструкторе, то общеязыковая
среда выполнения CLR уже не делает никаких
проверок прав доступа. Сборка, которой вы
передаете объект, может не иметь таких же
прав, как ваша. И если бы объект Filelnfo был
передан другой сборке, не получившей от
общеязыковой среды выполнения CLR права на
чтение, то ему общеязыковая среда
выполнения CLR все равно не помешала бы
получить доступ к файлу. Дело в том, что в
таком случае не было бы никакой
дополнительной проверки на безопасность.
Конечно, разработчики пошли на этот
компромисс ради производительности, —
чтобы избежать проверки на безопасность
при каждой операции. То же самое
справедливо и для других разрешений коду на
доступ.