Kod pokazujący znaczenie ograniczonego regionu wykonania

Czy ktoś mógłby stworzyć krótką próbkę , która się łamie, chyba że [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] zostanie zastosowana?

Właśnie przejrzałem tę próbkę na MSDN i nie jestem w stanie go złamać, nawet jeśli skomentuję atrybut reliability Contract. W końcu zawsze ktoś dzwoni.

Author: Sam Saffron, 2009-07-09

5 answers

using System;
using System.Runtime.CompilerServices;
using System.Runtime.ConstrainedExecution;

class Program {
    static bool cerWorked;

    static void Main( string[] args ) {
        try {
            cerWorked = true;
            MyFn();
        }
        catch( OutOfMemoryException ) {
            Console.WriteLine( cerWorked );
        }
        Console.ReadLine();
    }

    unsafe struct Big {
        public fixed byte Bytes[int.MaxValue];
    }

    //results depends on the existance of this attribute
    [ReliabilityContract( Consistency.WillNotCorruptState, Cer.Success )] 
    unsafe static void StackOverflow() {
        Big big;
        big.Bytes[ int.MaxValue - 1 ] = 1;
    }

    static void MyFn() {
        RuntimeHelpers.PrepareConstrainedRegions();
        try {
            cerWorked = false;
        }
        finally {
            StackOverflow();
        }
    }
}

Gdy MyFn jest jitted, próbuje utworzyć ConstrainedRegion z bloku finally.

  • W przypadku, w którym nie ma umowy o niezawodności, nie można utworzyć odpowiedniego ograniczenia, więc emitowany jest zwykły kod. Wyjątek przepełnienie stosu jest wyrzucany podczas wywołania Stackoverflow (po wykonaniu bloku try).

  • W przypadku niezawodności można utworzyć Ograniczony Region i wymagania stosu metod w końcu blok może być podniesiony do MyFn. Wyjątek przepełnienie stosu jest teraz rzucany przy wywołaniu MyFn (przed wykonaniem bloku try).

 43
Author: jyoung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-29 01:20:32

Głównym sterownikiem dla tej funkcjonalności była obsługa serwerów SQL Server 2005. Prawdopodobnie po to, aby inni mogli korzystać i prawdopodobnie ze względów prawnych ta głęboka integracja została opublikowana jako hosting API, ale wymagania techniczne były serwerami SQL. Pamiętaj, że w SQL Server MTBF jest mierzony w miesiącach, a nie w godzinach, a ponowne uruchomienie procesu, ponieważ wystąpił nieobsługiwany wyjątek, jest całkowicie niedopuszczalne.

This MSDN Artykuł w czasopiśmie jest chyba najlepszym, jaki widziałem opisującym wymagania techniczne, dla których zostało zbudowane ograniczone środowisko wykonawcze.

Umowa reliability Contract jest używana do dekoracji Twoich metod, aby wskazać, jak działają w kategoriach potencjalnie asynchronicznych WYJĄTKÓW (ThreadAbortException, OutOfMemoryException, StackOverflowException). Ograniczony obszar wykonania jest definiowany jako sekcja catch lub finally (lub fault) bloku try, która jest bezpośrednio poprzedzona przez wezwanie do systemu.Runtime.CompilerServices.RuntimeServices.PrepareConstrainedRegions().

System.Runtime.CompilerServices.RuntimeServices.PrepareConstrainedRegions();
try 
{
    // this is not constrained
} 
catch (Exception e) 
{
    // this IS a CER
} 
finally 
{
    // this IS ALSO a CER
}

Gdy metoda Niezawodnościcontract jest używana z poziomu CER, zdarzają się dwie rzeczy. Metoda będzie wstępnie przygotowana przez JIT tak, że nie wywoła kompilatora JIT przy pierwszym uruchomieniu, który może próbować użyć samej pamięci i spowodować własne wyjątki. Również podczas gdy wewnątrz CER runtime obiecuje nie rzucać wyjątku ThreadAbort i będzie czekać na rzucenie wyjątek do czasu zakończenia cer.

Więc wracając do twojego pytania; nadal próbuję wymyślić prostą próbkę kodu, która bezpośrednio odpowie na twoje pytanie. Jak już się domyślacie, najprostsza próbka będzie wymagała dość dużo kodu, biorąc pod uwagę asynchroniczny charakter problemu i prawdopodobnie będzie to kod SQLCLR, ponieważ jest to środowisko, które będzie używać Cer dla największych korzyści.

 17
Author: Peter Oehlert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-09 02:00:59

Czy uruchamiasz próbkę MSDN pod debugerem? Nie wydaje mi się, aby cer mógł funkcjonować, gdy wykonujesz w debuggerze, ponieważ sam debugger i tak zmienia charakter wykonania.

Jeśli zbudujesz i uruchomisz aplikację w zoptymalizowanym trybie wydania, powinieneś być w stanie zobaczyć, że się nie powiedzie.

 3
Author: jrista,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-27 23:50:01

Chociaż nie mam konkretnego przykładu dla ciebie, myślę, że nie masz sensu spróbować..wreszcie zablokować wewnątrz metod, które gwarantują sukces. Cały sens mówienia, że metoda zawsze się powiedzie oznacza, że w odniesieniu do tego, co (wyjątek) dzieje się podczas wykonywania, zostaną podjęte kroki w celu zapewnienia, że dane, do których dostęp jest dostępny, będą w stanie prawidłowym, gdy metoda powróci. Bez próby..w końcu niczego nie zapewnisz, a może to oznaczać, że tylko połowa operacja, którą chciałeś, to się wydarzy. Tak Więc, Cer.Sukces nie gwarantuje sukcesu, tylko stwierdza, że Ty jako deweloper gwarantujesz sukces.

Zajrzyj na tę stronę, aby znaleźć wyjaśnienie różnic między Stanami Success i MayFail, ponieważ odnosi się ona do tablicy.Metoda CopyTo: http://weblogs.asp.net/justin_rogers/archive/2004/10/05/238275.aspx

 1
Author: Relster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-09 02:00:10

Atrybuty CER są środkami dokumentacji. Mają one wpływ na to, jak CLR będzie wykonywać kod w niektórych sytuacjach, ale wierzę ,że (lub ich brak) nigdy nie spowoduje błędu w obecnych wersjach .NET.

Są one w większości "zarezerwowane do wykorzystania w przyszłości".

 -4
Author: ima,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-24 05:50:09