Ograniczone regiony wykonania
Region wykonywania ograniczonego (CER) jest częścią mechanizmu tworzenia niezawodnego kodu zarządzanego. Cer definiuje obszar, w którym środowisko uruchomieniowe języka wspólnego (CLR) jest ograniczone do wyrzucania wyjątków poza pasmem, które uniemożliwiłyby wykonywanie kodu w 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
, finally
i 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 środowiska CLR oprócz bloku z adnotacjami try
, zwłaszcza krytycznych finalizatorów wykonywanych w klasach pochodzących z CriticalFinalizerObject klasy i kodu wykonywanego ExecuteCodeWithGuaranteedCleanup przy użyciu metody .
Przygotowanie z wyprzedzeniem CER
ClR przygotowuje ceRs z wyprzedzeniem, aby uniknąć warunków braku pamięci. Przygotowanie z wyprzedzeniem jest wymagane, więc clR nie powoduje braku pamięci podczas kompilacji just in time lub ładowania typu.
Deweloper musi wskazać, że region kodu to CER:
Region i metody CER najwyższego poziomu w pełnym grafie wywołań, które mają ReliabilityContractAttribute zastosowany atrybut, są przygotowane z wyprzedzeniem. Może ReliabilityContractAttribute zawierać tylko gwarancje Success lub MayFail.
Nie można wykonać przygotowania zaawansowanego dla wywołań, których nie można określić statycznie, takich jak wysyłanie wirtualne. PrepareMethod Użyj metody w tych przypadkach. W przypadku korzystania z ExecuteCodeWithGuaranteedCleanup metody PrePrepareMethodAttribute należy zastosować atrybut do kodu czyszczenia.
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 blokady.
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
Jest ReliabilityContractAttribute to atrybut niestandardowy, który dokumentuje gwarancje niezawodności i stan uszkodzenia 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 zgłasza z powrotem metodę wywołującą, niezależnie od tego, czy zakończyła się powodzeniem, czy niepowodzeniem. Metoda musi być zawarta w cer, aby upewnić się, że może zgłosić wartość zwracaną.
None. Metoda, typ lub zestaw nie ma pojęcia CER i najprawdopodobniej nie jest bezpieczne wywołanie w cer bez znacznego ograniczenia ryzyka związanego z uszkodzeniem stanu. Nie korzysta z gwarancji CER. Oznacza to następujące kwestie:
W wyjątkowych warunkach metoda może zakończyć się niepowodzeniem.
Metoda może lub nie zgłosić, że nie powiodła się.
Metoda nie jest napisana w celu użycia cer, najbardziej prawdopodobnego scenariusza.
Jeśli metoda, typ lub zestaw nie są jawnie identyfikowane w celu pomyślnego działania, jest niejawnie identyfikowana 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 with
ReliabilityContractAttribute(Cer.Success)
oznacza, że po uruchomieniu w cer zawsze zwraca liczbę elementów w ArrayList obiekcie i nigdy nie może pozostawić pól wewnętrznych w stanie nieokreślonym. CompareExchange Jednak metoda jest oznaczona jako sukces, a zrozumienie, że sukces może oznaczać, że wartość nie może zostać zastąpiona nową wartością ze względu na warunek wyścigu. Kluczowym punktem jest to, że metoda zachowuje się w sposób udokumentowany do zachowania, a kod CER nie musi być napisany, aby oczekiwać żadnych nietypowych zachowań poza tym, jak poprawny, ale zawodny kod będzie wyglądać.
Poziomy uszkodzenia
Poziomy uszkodzenia, reprezentowane przez Consistency wartości wyliczenia, wskazują, ile stanu może być uszkodzony 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 nie ma gwarancji, że stan jest uszkodzony.
Niezawodność try/catch/finally
Niezawodność try/catch/finally
jest mechanizmem obsługi wyjątków z tym samym poziomem gwarancji przewidywalności co wersja niezarządzana. Blok catch/finally
jest CER. Metody w bloku wymagają wcześniejszego przygotowania i muszą być nieinterrupcyjne.
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średnie oczekiwanie na jego dostępność za pośrednictwem kompilatorów.
Regiony nieinterrupcyjne
Region nieinterrupcyjny grupuje zestaw instrukcji w cer.
W programie .NET Framework w wersji 2.0 oczekiwanie na dostępność za pośrednictwem obsługi kompilatora kod użytkownika tworzy niezwiązane regiony z niezawodnym elementem try/catch/finally zawierającym pusty blok try/catch poprzedzony PrepareConstrainedRegions wywołaniem metody.
Krytyczny obiekt finalizatora
Gwarantuje CriticalFinalizerObject , że odzyskiwanie pamięci spowoduje wykonanie finalizatora. Po alokacji finalizator i jego graf wywołań są przygotowane z wyprzedzeniem. 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 blokady.
Boks.
Dostęp do tablicy wielowymiarowej.
Metoda wywołuje odbicia.
Testy zabezpieczeń. Nie wykonuj żądań, tylko żądań linków.
Pobieranie lub ustawianie pól na przezroczystym serwerze proxy.
Serializacji.
Wskaźniki i delegaty funkcji.