//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
//
// Security\DeclarativeSecurity.cs
using System;
using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;

class NativeMethods
{
    // Wywołanie do niezarządzanego kodu. Wykonanie tej metody wymaga
    // uprawnienia zabezpieczeń UnmanagedCode. Próba wywołania tej metody
    // bez takiego uprawnienia spowoduje zgłoszenie wyjatku SecurityException:
    [DllImport("user32.dll")]
    public static extern int MessageBox(uint hWnd, string lpText, 
       string lpCaption, uint uType);
}

class MainClass
{
    // Uprawnienie zabezpieczeń powiązane z tą metodą spowoduje odrzucenie
    // uprawnienia UnmanagedCode z aktualnego zestawu uprawnień na czas
    // trwania wywołania tej metody:
    [SecurityPermission(SecurityAction.Deny, Flags = 
       SecurityPermissionFlag.UnmanagedCode)]
    private static void CallUnmanagedCodeWithoutPermission()
    {
        try
        {
            Console.WriteLine("Próba wywołania niezarządzanego kodu bez uprawnienia.");
            NativeMethods.MessageBox(0, "Witaj świecie!", "", 0);
            Console.WriteLine("Wywołano niezarządzany kod bez uprawnienia. Błąd!");
        }
        catch (SecurityException)
        {
            Console.WriteLine("Przechwycono wyjątek zabezpieczeń w czasie próby wywołania niezarządzanego kodu.");
        }
    }

    // Powiązane z tą metodą uprawnienie zabezpieczeń wymusi na module
    // wykonawczym kontrolę uprawnienia kodu niezarządzanego przy każdym
    // wywołaniu tej metody. Jeśli kod wywołujący nie posiada takiego uprawnienia,
    // to zostanie wygenerowany wyjątek zabezpieczeń.
	[SecurityPermission(SecurityAction.Demand, Flags = 
		 SecurityPermissionFlag.UnmanagedCode)]
	[SecurityPermission(SecurityAction.Assert, Flags = 
       SecurityPermissionFlag.UnmanagedCode)]
    private static void CallUnmanagedCodeWithPermission()
    {
        try
        {
            Console.WriteLine("Próba wywołania niezarządzanego kodu z uprawnieniem.");
            NativeMethods.MessageBox(0, "Witaj świecie!", "", 0);
            Console.WriteLine("Wywołano niezarządzany kod z uprawnieniem.");
        }
        catch (SecurityException)
        {
            Console.WriteLine("Przechwycono wyjątek zabezpieczeń w czasie próby wywołania niezarządzanego kodu.");
        }
    }

    public static void Main() 
    {
        CallUnmanagedCodeWithoutPermission();
        CallUnmanagedCodeWithPermission();
    }
}
