Udostępnij za pośrednictwem


Ograniczone regiony wykonywania

Region wykonywania ograniczonego (CER) jest częścią mechanizmu tworzenia niezawodnego kodu zarządzanego. CER określa obszar, w którym środowisko uruchomieniowe języka wspólnego (CLR) jest ograniczone w zarzucaniu wyjątków poza standardowym pasmem, co mogłoby uniemożliwić wykonanie kodu w tym obszarze w całości. W tym regionie kod użytkownika jest ograniczony do wykonywania kodu, co spowodowałoby zgłaszanie wyjątków poza pasmem. Metoda PrepareConstrainedRegions musi natychmiast poprzedzać try blok i oznaczać catch, finallyi fault bloki jako ograniczone regiony wykonywania. Po oznaczeniu jako ograniczony region kod musi wywoływać tylko inny kod z silnymi kontraktami niezawodności, a kod nie powinien przydzielać ani wykonywać wywołań wirtualnych do nieprzygotowanych lub zawodnych metod, chyba że kod jest przygotowany do obsługi błędów. CLR opóźnia przerwanie wątku dla kodu wykonywanego w CER.

Ważne

Cer jest obsługiwany tylko w programie .NET Framework. Ten artykuł nie dotyczy platformy .NET Core ani .NET 5 lub nowszej wersji.

Regiony wykonywania ograniczonego są używane w różnych formach w CLR, oprócz adnotowanego bloku try, zwłaszcza krytycznych finalizatorów wykonywanych w klasach pochodzących z klasy CriticalFinalizerObject oraz kodu wykonywanego za pomocą metody ExecuteCodeWithGuaranteedCleanup.

Przygotowanie CER z wyprzedzeniem

CLR przygotowuje CERs z wyprzedzeniem, aby uniknąć sytuacji braku pamięci. Przygotowanie z wyprzedzeniem jest wymagane, aby CLR nie powodowało braku pamięci podczas kompilacji just-in-time lub ładowania typu.

Deweloper musi wskazać, że region kodu to CER:

Ograniczenia

Użytkownicy są ograniczeni w typie kodu, który mogą pisać w cer. Kod nie może spowodować wyjątku poza pasmem, na przykład może wynikać z następujących operacji:

  • Jawna alokacja.

  • Boks.

  • Uzyskiwanie zamka.

  • Wirtualne wywoływanie nieprzygotowanych metod.

  • Wywoływanie metod przy użyciu słabego lub nieistniejącego kontraktu niezawodności.

W programie .NET Framework w wersji 2.0 te ograniczenia są wytycznymi. Diagnostyka jest dostarczana za pomocą narzędzi do analizy kodu.

Kontrakty niezawodności

Atrybut ReliabilityContractAttribute to niestandardowa cecha, która dokumentuje gwarancje niezawodności i stan uszkodzeń danej metody.

Gwarancje niezawodności

Gwarancje niezawodności reprezentowane przez Cer wartości wyliczenia wskazują stopień niezawodności danej metody:

  • MayFail. W wyjątkowych warunkach metoda może zakończyć się niepowodzeniem. W takim przypadku metoda informuje metodę wywołującą, czy zakończyła się sukcesem lub porażką. Metoda musi być zawarta w cer, aby upewnić się, że może zgłosić wartość zwracaną.

  • None. Metoda, typ lub zestaw nie uwzględnia koncepcji CER i najprawdopodobniej nie jest bezpieczne do wywołania w CER bez istotnych zabezpieczeń przed uszkodzeniem stanu. Nie korzysta z gwarancji CER. Oznacza to następujące kwestie:

    1. W wyjątkowych warunkach metoda może zakończyć się niepowodzeniem.

    2. Metoda może zgłosić, że nie powiodła się, albo nie zgłosi tego wcale.

    3. Metoda nie jest napisana do użycia CER, co jest najbardziej prawdopodobnym scenariuszem.

    4. Jeśli metoda, typ lub zbiór nie są jawnie identyfikowane jako odnoszące sukces, są niejawnie identyfikowane jako None.

  • Success. W wyjątkowych warunkach metoda ma gwarancję powodzenia. Aby osiągnąć ten poziom niezawodności, należy zawsze skonstruować CER wokół metody, która jest wywoływana, nawet jeśli jest wywoływana z poziomu regionu innego niż CER. Metoda jest skuteczna, jeśli osiąga to, co jest zamierzone, chociaż sukces może być postrzegany subiektywnie. Na przykład oznaczenie Count z ReliabilityContractAttribute(Cer.Success) oznacza, że gdy jest uruchamiane pod CER, zawsze zwraca liczbę elementów w ArrayList, i nigdy nie zostawia pól wewnętrznych w stanie nieokreślonym. Jednak metoda CompareExchange jest również oznaczona jako sukces, przy czym rozumie się, że sukces może oznaczać, iż wartość nie mogła być zastąpiona nową wartością ze względu na warunek wyścigu. Kluczową kwestią jest to, że metoda zachowuje się zgodnie z dokumentacją, a kod CER nie musi być napisany w sposób przewidujący jakiekolwiek nietypowe zachowania poza tymi, które mogłyby się pojawić w poprawnym, ale zawodnym kodzie.

Poziomy korupcji

Poziomy korupcji, reprezentowane przez Consistency wartości wyliczenia, wskazują, na ile stan może być skorumpowany w danym środowisku.

  • MayCorruptAppDomain. W wyjątkowych warunkach środowisko uruchomieniowe języka wspólnego (CLR) nie gwarantuje spójności stanu w bieżącej domenie aplikacji.

  • MayCorruptInstance. W wyjątkowych warunkach metoda ma gwarancję ograniczenia uszkodzenia stanu do bieżącego wystąpienia.

  • MayCorruptProcess, w wyjątkowych warunkach CLR nie gwarantuje spójności państwa; oznacza to, że warunek może uszkodzić proces.

  • WillNotCorruptState. W wyjątkowych warunkach metoda jest gwarantowana, że nie uszkodzi stanu.

Mechanizm niezawodności try/catch/finally

Niezawodność try/catch/finally jest systemem obsługi wyjątków o takim samym poziomie gwarancji przewidywalności jak wersja niezarządzana. Blok catch/finally jest CER. Metody w bloku wymagają uprzedniego przygotowania i muszą być nieprzerywalne.

W programie .NET Framework w wersji 2.0 kod informuje środowisko uruchomieniowe, że próba jest niezawodna, wywołując PrepareConstrainedRegions bezpośrednio poprzedzający blok try. PrepareConstrainedRegions jest członkiem RuntimeHelpersklasy pomocy technicznej kompilatora . Wywołaj PrepareConstrainedRegions bezpośrednio, oczekując na jego dostępność za pośrednictwem kompilatorów.

Regiony nieinterrupcyjne

Region nieinterrupcyjny grupuje zestaw instrukcji w cer.

W wersji 2.0 platformy .NET Framework, przy warunkowej dostępności przez wsparcie kompilatora, kod użytkownika tworzy nieprzerywalne regiony za pomocą niezawodnego bloku try/catch/finally, który zawiera pusty blok try/catch poprzedzony wywołaniem metody PrepareConstrainedRegions.

Krytyczny obiekt finalizatora

Gwarantuje CriticalFinalizerObject że garbage collection spowoduje wykonanie finalizatora. Po alokacji finalizator i jego graf wywołań są przygotowane z góry. Metoda finalizatora jest wykonywana w CER i musi przestrzegać wszystkich ograniczeń dotyczących CER i finalizatorów.

Wszystkie typy dziedziczone z SafeHandle i CriticalHandle mają gwarancję, że ich finalizator jest wykonywany w CER. Zaimplementuj ReleaseHandle w SafeHandle klasach pochodnych, aby wykonać dowolny kod, który jest wymagany do zwolnienia uchwytu.

Kod niedozwolony w cers

Następujące operacje nie są dozwolone w programach CER:

  • Alokacje jawne.

  • Uzyskiwanie zamka.

  • Boks.

  • Dostęp do tablicy wielowymiarowej.

  • Metoda wywołuje odbicia.

  • Enter lub Lock.

  • Testy zabezpieczeń. Nie wykonuj żądań, tylko łącz żądania.

  • Isinst i Castclass dla obiektów COM i serwerów proxy

  • Pobieranie lub ustawianie pól na przezroczystym serwerze proxy.

  • Serializacja.

  • Wskaźniki funkcji i delegaty.

Zobacz także