Я только что видел этот вопрос:
Понимание параметра 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? Очевидно, это тот же поток, хотя он не уничтожен сборщиком мусора, но в какой-то момент его удаляют / уничтожают / удаляют.