我刚刚看到这个问题:

理解为权限.NET的“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?许可对象是怎样治疗的,我想像垃圾收集器会破坏对象,因为我没有主动提及它,但代码表示的夹缝的,然后的,所以明确许可拒绝是在通过二层呼叫的效果。

是怎么回事?我在想什么?我承认自己是一个总的初学者,当谈到.NET中的安全性/许可制度所以请原谅我,如果这个问题真的是基本的。

是否安全许可/拒绝这样标志堆栈或什么?否则,为何不能在Layer2b影响?这是同一个线程,所以很显然,虽然它不是由垃圾收集杀死,它是越来越删除/销毁/在某个时候清理了。

有帮助吗?

解决方案

上的CodeAccessPermission调用.Deny()将导致.NET安全运行时设定为许可的当前堆栈帧的安全对象上的拒绝标志。 所以,即使你调用.Deny()后调用GC.Collect(),它并没有真正的问题,允许将保持有效。权限对象只是一个在一个时间点(堆栈帧)的.NET安全运行时的部分的状态的表示。

只要使用.NET反射来了解更多信息。

其他提示

在第一次看,我猜想,权限对象仍处于范围,因为它是该方法中定义的,它超出范围的二层法完成后,由此允许应用程序对函数的最后一行

正如接受的答案指出,这是监守它的范围是当前栈,与标准的对象范围,你不管理的参考。这是要记住它的最好办法

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top