Как реально работает защита .NET? - PullRequest
1 голос
/ 10 декабря 2008

Я только что видел этот вопрос:

Понимание параметра SecurityAction «SecurityAction» для разрешений

И у меня есть вопрос. Со следующим кодом:

private void button1_Click(object sender, EventArgs e)
{
    Layer1();
    MessageBox.Show("OK");
}

private void Layer1()
{
    try
    {
        Layer2();
    }
    catch (SecurityException)
    {
        MessageBox.Show("Caught");
    }
    Layer2b();
}

private void Layer2()
{
    new System.Security.Permissions.FileIOPermission(PermissionState.Unrestricted).Deny();
    GC.Collect();
    Layer3();
}

private void Layer2b()
{
    Layer3();
}

[FileIOPermission(SecurityAction.LinkDemand, Write=@"C:\temp")]
private void Layer3()
{
    using (FileStream stream = new FileStream(@"C:\temp\test.txt", FileMode.Create))
    {
    }
}

почему код создает исключение безопасности при вызове Layer2? Как обрабатывается объект разрешения, я бы предположил, что сборщик мусора уничтожит объект, поскольку у меня нет активной ссылки на него, но код говорит: Caught , а затем OK. , поэтому очевидно, что для вызова через Layer2 действует отказ в разрешении.

Что дает? Что мне не хватает? Я признаю, что являюсь абсолютным новичком, когда дело доходит до системы безопасности / разрешений в .NET, так что извините, если этот вопрос действительно простой.

Разрешает ли разрешение / отказ безопасности как этот флаг стек или что-то? Иначе, почему это не действует для Layer2b? Очевидно, это тот же поток, хотя он не уничтожен сборщиком мусора, но в какой-то момент его удаляют / уничтожают / удаляют.

Ответы [ 2 ]

3 голосов
/ 10 декабря 2008

Вызов .Deny () для CodeAccessPermission приведет к тому, что среда выполнения .NET Security установит флаг deny для объекта безопасности для текущего кадра стека для этого разрешения. Так что даже если вы вызываете GC.Collect () после вызова .Deny (), это не имеет значения, разрешение останется в силе. Объект разрешения - это просто представление состояния части среды выполнения .NET в определенный момент времени (фрейм стека).

Просто используйте .NET Reflector, чтобы узнать больше.

0 голосов
/ 10 декабря 2008

При первом взгляде я бы предположил, что объект разрешений все еще находится в области видимости, так как он определен внутри метода, он выпадает из области видимости после завершения метода Layer2, что позволяет последней строке вашего приложения функционировать .

Как отмечено в принятом ответе, это потому, что он находится в области действия текущего стека, связанной со стандартной областью объекта, вы просто не управляете ссылкой. Это лучший способ запомнить это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...