約束執行區域(CER)

受約束的執行區域 (CER) 是創作可靠托管代碼的機制的一部分。CER 定義一個區域,在該區域中公共語言運行庫 (CLR) 會受到約束,不能引發可使區域中的代碼無法完全執行的帶外異常在該區域中,用戶代碼受到約束,不能執行會導致引發帶外異常的代碼PrepareConstrainedRegions?方法必須直接位于?try塊之前,并將?catchfinally?和?fault?塊標記為受約束的執行區域。標記為受約束的區域后,代碼只能調用其他具有強可靠性約定的代碼,而且代碼不應分配或者對未準備好的或不可靠的方法進行虛調用,除非代碼已經準備好處理錯誤。CLR 為 CER 中正在執行的代碼延遲線程中止

除批注的?try?塊外,受約束的執行區域還以其他形式用于 CLR 中,特別是在從?CriticalFinalizerObject?類派生的類中執行的關鍵終止程序和使用ExecuteCodeWithGuaranteedCleanup?方法執行的代碼。

CER 事先準備

CLR 會事先準備 CER 以避免出現內存不足的情況。進行事先準備的目的是為了避免 CLR 在實時編譯或類型加載時發生內存不足的情況

開發人員需要指定一個代碼區域作為 CER:

  • 頂級 CER 區域和完整調用關系圖中應用了?ReliabilityContractAttribute?屬性的方法是事先準備好的。ReliabilityContractAttribute?只能聲明?Success?或MayFail?的保證。

  • 事先準備不能針對無法靜態確定的調用(如虛調度)執行。此時可使用?PrepareMethod?方法。使用?ExecuteCodeWithGuaranteedCleanup?方法時,應該對清理代碼應用?PrePrepareMethodAttribute?屬性。

約束

用戶可在 CER 中寫入的代碼的類型受到限制。代碼不能導致帶外異常,例如以下操作就可能導致此類異常:

  • 顯式分配。

  • 裝箱。

  • 獲取鎖。

  • 對未準備好的方法進行虛調用。

  • 調用具有弱可靠性約定或不具有可靠性約定的方法。

在 .NET Framework 2.0 版中,這些約束稱為準則。診斷通過代碼分析工具提供。

可靠性協定

ReliabilityContractAttribute?是記錄給定方法的可靠性保證和損壞狀態的自定義屬性。

可靠性保證

可靠性保證由?Cer?枚舉值表示,指示給定方法的可靠度

  • MayFail?。在異常情況下,該方法可能會失敗。在這種情況下,該方法會向進行調用的方法報告是成功還是失敗。該方法必須包含在 CER 中,以確保它可以報告返回值。

  • None?。該方法、類型或程序集沒有 CER 的概念,如果不從狀態損壞進行遷移,則在 CER 內進行調用很可能是不安全的。它不利用 CER 保證。這意味著:

    1. 在異常情況下,該方法可能會失敗。

    2. 該方法可能報告失敗,也可能不報告失敗。

    3. 最可能的情形是未編寫該方法以使用 CER。

    4. 如果方法、類型或程序集未顯式標識為成功的,則會隱式標識為?None

  • Success?。在異常情況下,會保證該方法能夠成功。若要達到此可靠性級別,應始終在調用的方法周圍構造 CER,即使是從非 CER 區域內進行調用。如果一個方法完成了其任務,它就是成功的,雖然這種成功可能只是主觀認為的成功。例如,用?ReliabilityContractAttribute(Cer.Success)?標記 Count 意味著當它在 CER 下運行時,它始終返回?ArrayList?中元素的數目的計數,并且它永遠不能將內部字段保留為不確定狀態。 但是,CompareExchange方法也標記為成功,這里的成功意味著該值不會因爭用條件而替換為新值。 關鍵在于該方法的行為方式與記錄的行為方式相同,不需要在 CER 代碼中處理除正確但不可靠代碼的行為之外的任何非正常行為。

損壞級別

損壞級別由?Consistency?枚舉值表示,指示給定環境下狀態的損壞程度:

  • MayCorruptAppDomain?。在異常情況下,公共語言運行庫 (CLR) 對當前應用程序域中的狀態一致性不做任何保證。

  • MayCorruptInstance?。在異常情況下,該方法保證將狀態損壞限制到當前實例。

  • MayCorruptProcess?,在異常情況下,CLR 對狀態一致性不做任何保證;即這種情況可能會損壞進程。

  • WillNotCorruptState?。在異常情況下,保證該方法不會損壞狀態。

可靠性 try/catch/finally

可靠性?try/catch/finally?是一種異常處理機制,其可預知性保證的級別與非托管版本相同。catch/finally?塊為 CER。塊中的方法需要事先準備,并且必須是不可中斷的

在 .NET Framework 2.0 版中,代碼通過在 try 塊前直接調用?PrepareConstrainedRegions?來通知運行庫 try 是可靠的。PrepareConstrainedRegions?是編譯器支持類?RuntimeHelpers?的成員。通過使用編譯器暫停可用性,直接調用?PrepareConstrainedRegions。

不可中斷區域

不可中斷區域可將一組指令分組到 CER 中

在 .NET Framework 2.0 版中,通過使用編譯器支持暫停可用性,用戶代碼創建不可中斷的區域,其中具有包含前面是?PrepareConstrainedRegions?方法調用的空 try/catch 塊的可靠 try/catch/finally。

關鍵終結器對象

CriticalFinalizerObject?保證垃圾回收會執行終結器。進行分配時,終結器及其調用關系圖是事先準備好的。終結器方法在 CER 中執行,并且必須服從所有有關 CER 和終結器的約束。

從?SafeHandle?和?CriticalHandle?繼承的任何類型都保證在 CER 內執行其終結器。在?SafeHandle?派生類中實現?ReleaseHandle?可執行釋放句柄所需的所有代碼。

CER 中不允許的代碼

CER 中不允許下面的操作:

  • 顯式分配。

  • 獲取鎖。

  • 裝箱。

  • 多維數組訪問。

  • 通過反射進行的方法調用。

  • Enter?或?Lock。

  • 安全檢查。不執行命令,僅鏈接命令。

  • COM 對象和代理的?Isinst?和?Castclass

  • 獲取或設置透明代理上的字段。

  • 序列化。

    函數指針和委托。

    •   class Program
      {
         static void Main()
      {
      RuntimeHelpers.PrepareConstrainedRegions();
      try
      {
      Console.WriteLine("try");
      }
      finally
      {
      type.dosome();

      }
      Console.WriteLine();
      Console.ReadKey();
      }

      }
      class type
      {
      static type()
      {
      Console.WriteLine("ctor");

      }
      [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
      public static void dosome()
      {
      }
      }



轉載于:https://www.cnblogs.com/smailxiaobai/archive/2011/12/28/2304738.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377870.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377870.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377870.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python 抓取網頁鏈接_從Python中的網頁抓取鏈接

python 抓取網頁鏈接Prerequisite: 先決條件: Urllib3: It is a powerful, sanity-friendly HTTP client for Python with having many features like thread safety, client-side SSL/TSL verification, connection pooling, file uploading with multipart encod…

四、模擬英語四六級答題卡識別閱卷評分

一、思路分析 首先拿到答題卡照片的時候,需要對照片進行一系列預處理操作,通過透視變換將圖像擺正方便后續的操作。每一道題五個選項,有五道題,通過字典存放準確答案。沒有依次對答題卡進行輪廓檢測,這里采用的是正方…

leetcode 17. 電話號碼的字母組合 思考分析

題目 給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。 給出數字到字母的映射如下(與電話按鍵相同)。注意 1 不對應任何字母。 思考與遞歸程序 解空間樹的寬度是輸入數字對應的字符的個數,深度是輸入的數字的個數…

Blockquotes,引用,html里面,經常用到的一個!

blockquote元素的使用已經非常多樣化&#xff0c;但語義上它只適用于一件事–標記了一段你的網頁被引用從另一來源。這意味著&#xff0c;如果你想讓那些花俏的引文&#xff0c;<blockquote>是不是你應該使用元素。讓我們看一看如何你應該使用此元素&#xff1a; <art…

仔細分析了下這7行,貌似時間復雜度,空間復雜度都不大,為嘛就是執行效率這么低?...

for(Girl girl Girls.first(); !myGirlFriend.like(me); girl Girls.next()){if(!girl.hasBoyFriend(now) && i.like(girl)) { GirlFriend myGirlFriend (GirlFriend)girl; }} 轉載于:https://www.cnblogs.com/naran/archive/2011/12/28/2305467.html…

BHMS的完整形式是什么?

BHMS&#xff1a;順勢療法醫學和外科學士 (BHMS: Bachelor of Homeopathic Medicine and Surgery) BHMS is an abbreviation of Bachelor of Homeopathic Medicine and Surgery. It is a medical degree program for under graduation in Homeopathy; an alternative move towa…

c++編程思想2 --友元存儲控制

友元friend在c中的應用 我們知道在c的類訪問權限中,private和 protected在類外面進行訪問的時候 會因為權限而不能訪問 &#xff0c;友元就解決了這個問題 。 可以這樣理解&#xff0c;他為外部的 函數 或者類 進行了 訪問授權,其實這已經超出OOP的范疇,但是對于C而言是以實用…

WordPress Event Easy Calendar插件多個跨站請求偽造漏洞

漏洞名稱&#xff1a;WordPress Event Easy Calendar插件多個跨站請求偽造漏洞CNNVD編號&#xff1a;CNNVD-201309-083發布時間&#xff1a;2013-09-11更新時間&#xff1a;2013-09-11危害等級&#xff1a; 漏洞類型&#xff1a;跨站請求偽造威脅類型&#xff1a;遠程CVE編號&…

XML轉txt格式腳本

一、東北大學老師收集的鋼材缺陷數據集是XML格式的&#xff0c;但是YOLOv5只允許使用txt文件標簽 例如其中一種缺陷圖片所對應的標簽&#xff1a;crazing_1.xml <annotation><folder>cr</folder><filename>crazing_1.jpg</filename><source&…

python程序生成exe_使用Python程序生成QR代碼的Python程序

python程序生成exeQR code is a short form of the quick response code. It is a type of matrix barcode that contains some information like some specific link, important message, email-id, etc. In Python, the qrcode module is used to generate the QR code of so…

leetcode 242. 有效的字母異位詞 思考分析

題目 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的字母異位詞。 我們先考慮低階版本&#xff0c;認為字符只有26種可能&#xff0c;然后將a ~ z的字符映射到數組的索引0 ~ 25&#xff0c;數組中存放的則是該索引出現的頻次。 記錄下s的頻次和t的頻次…

總結一下ERP .NET程序員必須掌握的.NET技術,掌握了這些技術工作起來才得心應手...

從畢業做.NET到現在&#xff0c;有好幾年了&#xff0c;自認為只能是達到熟練的水平&#xff0c;談不上精通。所以&#xff0c;總結一下&#xff0c;自己到底熟練掌握了哪些.NET方面的開發技術&#xff0c;以此對照&#xff0c;看看還有哪些不足&#xff0c;歡迎補充。 1 .NET …

js \n直接顯示字符串_顯示N個字符的最短時間

js \n直接顯示字符串Problem statement: 問題陳述&#xff1a; You need to display N similar characters on a screen. You are allowed to do three types of operation each time. 您需要在屏幕上顯示N個相似的字符。 每次允許您執行三種類型的操作。 You can insert a c…

示例 Demo 工程和 API 參考鏈接

Camera Explorer&#xff1a;有關 Windows Phone8 中有關增強 Camera API 的使用。文章鏈接 Filter Effects&#xff1a;對拍攝的照片或者圖片庫中的照片應用 Nokia Imaging SDK 中的濾鏡。文章鏈接 Filter Explorer&#xff1a;演示了對新拍攝圖片或者現有圖片的編輯功能&…

三、標簽準備

所有操作均在anaconda中的自己配置的環境下進行 一、安裝labelimg 因為YOLO模型所需要的樣本標簽必須是txt類型&#xff0c;本人使用labelimg軟件進行對圖像進行打標簽操作。 pip install pycocotools-windows pip install pyqt5 pip install labelimg 通過labelimg命令打…

ubuntu 8.04安裝應用軟件Can't find X includes錯誤解決辦法

系統很小。應用軟件都的自己裝。 首先把 APT’s database is not updated. # apt-get update    # apt-get upgrade 再裝其它軟件。 make xconfigure 無法運行時&#xff1a; apt-get install qt3-dev-tools 編譯QVFB  是出現&#xff1a; 出現&#xff1a;C preproces…

leetcode 39. 組合總和 思考分析

目錄1、題目2、思考分析3、未經優化代碼4、剪枝優化1、題目 給定一個無重復元素的數組 candidates 和一個目標數 target &#xff0c;找出 candidates 中所有可以使數字和為 target 的組合。 candidates 中的數字可以無限制重復被選取。 2、思考分析 解空間樹寬度部分即數…

java uuid靜態方法_Java UUID equals()方法與示例

java uuid靜態方法UUID類equals()方法 (UUID Class equals() method) equals() method is available in java.util package. equals()方法在java.util包中可用。 equals() method is used to check whether this object equals to the given object or not. equals()方法用于檢…

一、機器學習概念

一、何為機器學習(Mechine Learning)&#xff1f; 答&#xff1a;利用已有數據(經驗)&#xff0c;來訓練某種模型&#xff0c;利用此模型來預測未來。機器學習是人工智能的核心Mechine Learning。 例如&#xff1a;你和狗蛋兒7點在老槐樹下集合&#xff0c;如何一塊約去開黑&a…

Java線程新特征——Java并發庫

一、線程池 Sun在Java5中&#xff0c;對Java線程的類庫做了大量的擴展&#xff0c;其中線程池就是Java5的新特征之一&#xff0c;除了線程池之外&#xff0c;還有很多多線程相關的內容&#xff0c;為多線程的編程帶來了極大便利。為了編寫高效穩定可靠的多線程程序&#xff0c;…