سؤال

ولقد شهد هذا السؤال:

فهم الصافي في "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؟ كيف يتم التعامل مع الكائن إذن، كنت أتصور أن جمع القمامة من شأنه أن يدمر الجسم، وبما أنني لم يكن لديك إشارة نشطة لذلك، ولكن يقول رمز <م> القبض ، ثم <م> OK ، لذلك بوضوح رفض إذن هو في الواقع لهذه الدعوة من خلال Layer2.

وماذا يعطي؟ ماذا ينقصني؟ أنا أعترف إلى كونه مبتدئا الكلي عندما يتعلق الأمر بنظام الضمان / إذن في. NET فاغفر لي ما إذا كان هذا السؤال هو حقا الأساسية.

هل إذن الأمن / إنكار مثل هذا العلم مكدس أو شيء من هذا؟ وإلا، لماذا هو غير سار لLayer2b؟ انها نفس الموضوع، لذلك بشكل واضح، في حين لم يتم قتل من قبل جمع القمامة، هو الحصول على إزالته / دمر / تنظيف الحظائر في مرحلة ما.

هل كانت مفيدة؟

المحلول

ودعوة .Deny () على CodeAccessPermission سيكون سببا في وقت التشغيل الأمن .NET لتعيين نفي العلم على الكائن الأمن للإطار مكدس الحالي لهذا الإذن. لذلك حتى لو كنت استدعاء الأسلوب GC.Collect () بعد استدعاء .Deny ()، فإنه لا يهم حقا، إذن ستبقى سارية المفعول. الكائن إذن هو مجرد تمثيل الدولة في جزء من وقت التشغيل. NET الأمن عند نقطة في الوقت المناسب (إطار مكدس).

ومجرد استخدام. NET العاكس لمعرفة المزيد.

نصائح أخرى

وعند أول نظرة، وأود أن أعتقد أن هذا الكائن إذن لا تزال في نطاق، كما هو معرف داخل الأسلوب، فإنه يقع خارج النطاق بعد الانتهاء من طريقة Layer2، مما يسمح السطر الأخير من التطبيق الخاص بك إلى وظيفة .

وكما لاحظ الجواب المقبول، وهذا هو احتوائه في نطاق كومة الحالي، تتعلق نطاق الكائن القياسية، أنت فقط لا تدير المرجع. وهذا هو أفضل وسيلة لنتذكر أنه

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top