加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

.net – 从非托管代码生成MSIL的方法有哪些

发布时间:2020-12-15 04:34:25 所属栏目:大数据 来源:网络整理
导读:我正在尝试为.NET平台创建我的语言的后端. 用Delphi编写的前端和解释器. 非托管API只允许类型定义但不发出MSIL. 有哪些方法可以从非托管代码生成MSIL? 不使用Reflection.Emit并使用ILasm来实现这一目标? 谢谢. 解决方法 Delphi的.NET代码生成器将IL作为字
我正在尝试为.NET平台创建我的语言的后端.
用Delphi编写的前端和解释器.
非托管API只允许类型定义但不发出MSIL.

有哪些方法可以从非托管代码生成MSIL?
不使用Reflection.Emit并使用ILasm来实现这一目标?
谢谢.

解决方法

Delphi的.NET代码生成器将IL作为字节码直接发送到内存中,就像x86代码生成一样,但是具有适当的头部等.也就是说,代码生成器直接发送对应于编码的IL格式的字节,异常表等.它不是用API做的,而是用老式的方式:一次写一个字节的代码.

之后,Delphi的内置链接器与IMetaDataEmit等一起生成元数据,IMetaDataEmit :: SetRVA用于告知代码将位于可执行文件中的元数据.使用IMetaDataEmit :: SaveToMemory复制元数据,然后将其复制到链接器已构建的PE中,并相应地修补CLR标头以指向元数据开始.

这是很多代码,其中一些是繁琐的,因为它的大部分内容都是通过Delphi现有的x86链接器进行的,它实现了分支优化和消除未使用的代码(智能链接),严格来说,.NET通常不需要这些代码. .

如果我们再次这样做,我们可能会完全避免使用.NET API来创建元数据,并直接从规范生成整个内容. API最终成为优化的黑盒子,并且累积了大量的编译时间.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读