Frage

Ich sah nur diese Frage:

Verständnis von .NET „Security“ Parameter für Berechtigungen

Und ich habe eine Frage. Mit dem folgenden Code:

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))
    {
    }
}

Warum produziert der Code eine Sicherheitsausnahme mit dem Aufruf von Layer2? Wie wird die Erlaubnis Objekt behandelt, ich könnte mir vorstellen, dass der Garbage Collector das Objekt zerstören würde, da ich keine aktive Verweis darauf haben, aber der Code sagt Gefangen und dann OK , so eindeutig die Erlaubnis Leugnung ist in der Tat für den Anruf durch Layer2.

Was soll das? Was vermisse ich? Ich gebe ein totaler Anfänger zu sein, wenn es um die Sicherheit / Berechtigungssystem kommt in .NET mir so vergeben, wenn diese Frage wirklich einfach.

Gibt es eine Sicherheits Zustimmung / Ablehnung wie diese Flagge den Stapel oder so etwas? Warum sonst ist es nicht in der Tat für Layer2b? Es ist das gleiche Gewinde, so deutlich, während es nicht von der Garbage Collection getötet wird, wird es irgendwann entfernt / zerstört / gereinigt zu werden.

War es hilfreich?

Lösung

Beim .Deny () auf einem Codeaccess wird die .NET-Sicherheitslaufzeit verursacht die leugnen Flagge auf dem Sicherheitsobjekt für den aktuellen Stapelrahmen für diese Berechtigung zu setzen. Also selbst wenn Sie GC.Collect () aufrufen, nach dem Aufruf .Deny (), ist es nicht wirklich wichtig, wird die Erlaubnis wirksam bleiben. Das Berechtigungsobjekt ist nur eine Darstellung des Zustandes des Teils der .NET-Sicherheitslaufzeit zu einem Zeitpunkt (ein Stapelrahmen).

Verwenden Sie einfach .NET Reflector mehr zu erfahren.

Andere Tipps

Auf dem ersten Blick, ich würde vermuten, dass die Erlaubnis Objekt noch im Rahmen ist, wie es in der Methode definiert ist, fällt es außerhalb des Gültigkeitsbereiches nach dem Abschluss des Verfahrens Layer2, wodurch die letzte Zeile Ihrer Anwendung ermöglicht zu Funktion .

Wie die akzeptierten Antwort erwähnt, dies ist becuase es im Gültigkeitsbereich des aktuellen Stack ist, bezogen auf Standard-Objektumfang, Sie nicht nur die Referenz verwalten. Das ist der beste Weg, es zu merken

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top