Reflection.Emit.ILGenerator 异常处理“离开”指令

2024-02-24

首先,一些背景信息:

我正在为学校项目制作编译器。它已经在工作了,我正在花费大量的精力来修复错误和/或优化它。我最近遇到的一个问题是我发现 ILGenerator 对象生成了一个额外的leave当您调用以下任何成员方法时的说明:

BeginCatchBlock()
BeginExceptFilterBlock()
BeginFaultBlock()
BeginFinallyBlock()
EndExceptionBlock()

因此,您可以通过调用来开始一个 try 语句BeginExceptionBlock(),添加几个 catch 子句BeginCatchBlock(),可能添加一个finally子句BeginFinallyBlock(),然后结束受保护的代码区域EndExceptionBlock().

我列出的方法会自动生成leave指令分支到 try 语句之后的第一条指令。我不想要这些,有两个原因。一,因为它总是生成未经优化的leave指令,而不是leave.s指令,即使它只分支两个字节。第二,因为你无法控制离开指令的去向。

因此,如果您想分支到代码中的其他位置,则必须添加编译器生成的局部变量,根据您想要在 try 语句中进入的位置进行设置,让EndExceptionBlock()自动生成leave指令,然后在 try 块下面生成一个 switch 语句。或者,你可以发出一个leave or leave.s在调用前面的方法之一之前,请自行指导,导致丑陋且无法访问的额外 5 个字节,如下所示:

L_00ca: leave.s L_00e5
L_00cc: leave L_00d1

这两种选择对我来说都是不可接受的。有什么办法可以阻止自动生成leave指令,或者任何其他方式来指定受保护区域,而不是使用这些方法(这非常烦人并且实际上没有记录)?

编辑 注意:C# 编译器本身会执行此操作,因此似乎没有充分的理由将其强加给我们。例如,如果您有.NET 4.5 beta,请反汇编以下代码并检查其实现:(内部添加的异常块)

public static async Task<bool> TestAsync(int ms)
{
    var local = ms / 1000;
    Console.WriteLine("In async call, before await " + local.ToString() + "-second delay.");
    await System.Threading.Tasks.Task.Delay(ms);
    Console.WriteLine("In async call, after await " + local.ToString() + "-second delay.");

    Console.WriteLine();
    Console.WriteLine("Press any key to continue.");
    Console.ReadKey(false);
    return true;
}

据我所知,您无法在 .NET 4.0 中执行此操作。创建方法体的唯一方法without using ILGenerator是通过使用MethodBuilder.CreateMethodBody,但这不允许您设置异常处理信息。和ILGenerator迫使leave您所询问的说明。

但是,如果 .NET 4.5 适合您(似乎是),请查看MethodBuilder.SetMethodBody http://msdn.microsoft.com/en-us/library/system.reflection.emit.methodbuilder.setmethodbody%28v=vs.110%29.aspx。这允许您自己创建 IL,但仍然传递异常处理信息。您可以将其包装在自定义中ILGenerator-就像你自己的班级一样,Emit方法采用OpCode论证、阅读OpCode.Size and OpCode.Value来获取对应的字节。

当然,总有莫诺·塞西尔 http://www.mono-project.com/Cecil,但这可能需要对您已经编写的代码进行更广泛的更改。

Edit: 你自己似乎已经明白了这一点 https://stackoverflow.com/questions/9644039/net-4-5-methodbuilder-setmethodbody,但你没有回答这个问题。如果您自己解决了问题,您可以发布自己问题的答案并接受它们。这会让我知道我不应该浪费时间搜索,这会让其他有同样问题的人知道该怎么做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Reflection.Emit.ILGenerator 异常处理“离开”指令 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 重载<<的返回值

    include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co

随机推荐

  • Google 跟踪代码管理器:跟踪“选择”下拉菜单“选项”标签值

    我无法跟踪 选择 标签中 选项 标签的值 我目前有一个 Google Translator Widget 的下拉菜单 用户可以单击它并选择语言 当您单击 选择语言 下拉菜单时 您将能够看到德语选项 请参阅随附的屏幕截图 我在 Google
  • 显示个人用户评级(letrate gem)

    我目前正在使用 Letsrate gem https github com muratguzel https github com muratguzel 在我的应用程序中 评级显示正确 但是 我想显示单个用户提交的评分 而不仅仅是显示平均值
  • preg_match错误未知修饰符“{”[重复]

    这个问题在这里已经有答案了 这有什么问题吗 if preg match a zA Z 1 7 POST naam and preg match lt gt a zA Z0 9 POST password 第一个正则表达式我想要一个 1 7
  • Github 操作:npm install -> 错误:进程已完成,退出代码 1

    我的这个 GitHub 操作工作流程已经运行了一年多了 当我到达运行 npm install 的步骤时 突然出现错误 我真的不知道为什么会触发错误 非常感谢有人帮助或至少为我指明正确的方向 如果您需要更多数据 请告诉我 我将编辑问题 我尝试
  • 使用 OS X 的情节提要初始化另一个窗口

    我在 Xcode6 中创建了一个使用故事板的 Cocoa 应用程序 作为模板 Xcode 为应用程序提供了一个窗口 我想添加第二个窗口来显示程序首次加载的时间 所以基本上 会出现两个窗口 我在 Main storyboard 上放置了一个窗
  • 使用 ASIO 的线程池 - 线程退出,任务未执行

    我正在使用 Boost ASIO 用 C 编写一个 ThreadPool 类 以下是我迄今为止编写的代码 线程池类 using namespace std using namespace boost class ThreadPoolClas
  • 如何计算多标签分类的 F1-Score?

    我尝试计算f1 score但当我使用 sklearn 时 我在某些情况下收到一些警告f1 score method 我有一个多标签 5 类预测问题 import numpy as np from sklearn metrics import
  • 在 delphi 7.0 中创建打包结构时出现错误 EStackOverflow

    在 Borland Delphi 7 0 中创建打包结构时出现 EStackOverflow 我想做以下事情 Type T4 packed record VT integer SKT byte end T3 packed record O
  • 为什么 emplace_back() 不使用统一初始化?

    以下代码 include
  • Javascript 数组计数与控制台不一致? [复制]

    这个问题在这里已经有答案了 我在这里是不是很傻 我来自 Ruby 所以我可能缺少一些有关 Javascript 数组的内容 console log new devices 控制台结果 Array 1 console log new devi
  • 从嵌入资源加载模板

    如何将嵌入资源作为 ITemplate 加载 LoadTemplate 方法仅采用字符串虚拟路径 显然这不适用于嵌入式资源 假设您的模板是嵌入的并且需要保持这种方式 我认为您可能需要重新考虑 这是我不久前编写的一个函数 在处理嵌入文件 主要
  • EF6 防止不在外键上创建索引

    我在用着EF6创建数据库的代码优先方法 当我添加迁移和更新数据库时 它总是创建Non cluster Index默认情况下 对于表中的每个外键 我的问题 是否有 EF6 不创建的全局设置Non Cluster index在外键上 我搜索并找
  • 按组对变量进行排名 (dplyr)

    我有一个包含列的数据框x1 x2 group我想生成一个带有额外列的新数据框rank这表明了顺序x1在其组中 有一个相关问题here https stackoverflow com questions 28018933 r data fra
  • Office集成(Word)-拦截保存

    我计划实施一个小型内部文档管理系统 它必须有一个 Web GUI 用于管理存储在数据库中的远程文件夹结构 这些文件夹中存储了 Word 文档 物理上作为数据库中的 blob 每当用户单击文档链接时 就会通过浏览器下载单词二进制文件 并 希望
  • 使用 JSF Datatable 有条件地显示行

    我有一些当前有效的 JSF 代码 如下所示 我需要修改它以有条件地抑制表中某些行的显示 我知道如何有条件地抑制特定单元格的显示 但这似乎会创建一个空单元格 而我想做的是根本不显示该行 有什么建议么
  • 理论:压缩算法可以使某些文件变小但不会变大?

    我遇到了这个问题 无损压缩算法声称可以保证使某些文件变小并且不会使文件变大 这是 a 不可能 b 可能 但可能运行不确定的时间 c 压缩系数为 2 或更低时可能 d 对于任何压缩因子都可能吗 我倾向于 a 但无法给出具体原因 我将列出我和朋
  • 如何使用相对路径而不包含上下文根名称?

    要工作我的静态文件 CSS JS 我必须编写绝对路径 例如 AppName templates style main css 有没有什么解决方案 我可以写相对路径style main css If your actual关注的是 webap
  • Twitter URL 中的 (#!) 有何作用? [复制]

    这个问题在这里已经有答案了 可能的重复 Facebook 和新 Twitter 网址中的 shebang 有何用途 https stackoverflow com questions 3009380 whats the shebang in
  • XPT 到 CSV 的转换? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也许这是错误的地方 但我不太确定该把它放在哪里 我有一个非常大的 XPT 格式的压缩 SAS 文件 我
  • Reflection.Emit.ILGenerator 异常处理“离开”指令

    首先 一些背景信息 我正在为学校项目制作编译器 它已经在工作了 我正在花费大量的精力来修复错误和 或优化它 我最近遇到的一个问题是我发现 ILGenerator 对象生成了一个额外的leave当您调用以下任何成员方法时的说明 BeginCa