约束执行区域(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,一经查实,立即删除!

相关文章

四、模拟英语四六级答题卡识别阅卷评分

一、思路分析 首先拿到答题卡照片的时候,需要对照片进行一系列预处理操作,通过透视变换将图像摆正方便后续的操作。每一道题五个选项,有五道题,通过字典存放准确答案。没有依次对答题卡进行轮廓检测,这里采用的是正方…

leetcode 17. 电话号码的字母组合 思考分析

题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 思考与递归程序 解空间树的宽度是输入数字对应的字符的个数,深度是输入的数字的个数…

BHMS的完整形式是什么?

BHMS:顺势疗法医学和外科学士 (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…

WordPress Event Easy Calendar插件多个跨站请求伪造漏洞

漏洞名称:WordPress Event Easy Calendar插件多个跨站请求伪造漏洞CNNVD编号:CNNVD-201309-083发布时间:2013-09-11更新时间:2013-09-11危害等级: 漏洞类型:跨站请求伪造威胁类型:远程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的频次…

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…

三、标签准备

所有操作均在anaconda中的自己配置的环境下进行 一、安装labelimg 因为YOLO模型所需要的样本标签必须是txt类型&#xff0c;本人使用labelimg软件进行对图像进行打标签操作。 pip install pycocotools-windows pip install pyqt5 pip install labelimg 通过labelimg命令打…

leetcode 39. 组合总和 思考分析

目录1、题目2、思考分析3、未经优化代码4、剪枝优化1、题目 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 2、思考分析 解空间树宽度部分即数…

一、机器学习概念

一、何为机器学习(Mechine Learning)&#xff1f; 答&#xff1a;利用已有数据(经验)&#xff0c;来训练某种模型&#xff0c;利用此模型来预测未来。机器学习是人工智能的核心Mechine Learning。 例如&#xff1a;你和狗蛋儿7点在老槐树下集合&#xff0c;如何一块约去开黑&a…

Java线程新特征——Java并发库

一、线程池 Sun在Java5中&#xff0c;对Java线程的类库做了大量的扩展&#xff0c;其中线程池就是Java5的新特征之一&#xff0c;除了线程池之外&#xff0c;还有很多多线程相关的内容&#xff0c;为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序&#xff0c;…

leetcode 40. 组合总和 II 思考分析

题目 给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 思考以及代码 如果我们直接套用39题的思路&#xff0c;那么就会出现重复的组合。 重复组合的…

二、线性回归

一、回归 可以拿正态分布为例&#xff0c;比如身高&#xff0c;若平均身高为1.78m&#xff0c;绝大多数人都是1.78m左右&#xff0c;超过2m的很少&#xff0c;低于1m的也不多。 很多事情都会回归到一定的区间之内&#xff0c;即回归到平均值。 机器学习没有完美解&#xff0c…

【转】HMM学习最佳范例五:前向算法1 .

五、前向算法&#xff08;Forward Algorithm&#xff09; 计算观察序列的概率&#xff08;Finding the probability of an observed sequence&#xff09; 1.穷举搜索&#xff08; Exhaustive search for solution&#xff09;  给定隐马尔科夫模型&#xff0c;也就是在模型参…

leetcode 349. 两个数组的交集 思考分析

题目 给定两个数组&#xff0c;编写一个函数来计算它们的交集。 1、暴力双for循环 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> result;vector<int> res;if(nums1.siz…

三、梯度下降法求解最优θ值

一、梯度下降法(GD&#xff0c;Gradient Descent) Ⅰ、得到目标函数J(θ)&#xff0c;求解使得J(θ)最小时的θ值 当然&#xff0c;这里只是取了俩特征而已&#xff0c;实际上会有m个特征维度 通过最小二乘法求目标函数最小值 令偏导为0即可求解出最小的θ值&#xff0c;即…

leetcode 131. 分割回文串 思考分析

题目 给定一个字符串 s&#xff0c;将 s 分割成一些子串&#xff0c;使每个子串都是回文串。 返回 s 所有可能的分割方案。 思考 问题可以分为两个子问题&#xff1a;1、判断回文串2、分割数组 判断回文串 bool isPalindrome_string(string s,int startindex,int endinde…

android淡入淡出动画_在Android中淡入动画示例

android淡入淡出动画1) XML File: activity_main 1)XML文件&#xff1a;activity_main <?xml version"1.0" encoding"utf-8"?><android.support.constraint.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android&…

[慢查优化]联表查询注意谁是驱动表 你搞不清楚谁join谁更好时请放手让mysql自行判定...

写在前面的话&#xff1a; 不要求每个人一定理解 联表查询(join/left join/inner join等)时的mysql运算过程&#xff1b; 不要求每个人一定知道线上&#xff08;现在或未来&#xff09;哪张表数据量大&#xff0c;哪张表数据量小&#xff1b; 但把mysql客户端&#xff08;如SQL…