约束执行区域(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.mzph.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;…