我正在尝试为.NET平台创建我的语言的后端.
用Delphi编写的前端和解释器.
非托管API只允许类型定义但不发出MSIL.
用Delphi编写的前端和解释器.
非托管API只允许类型定义但不发出MSIL.
解决方法
Delphi的.NET代码生成器将IL作为字节码直接发送到内存中,就像x86代码生成一样,但是具有适当的头部等.也就是说,代码生成器直接发送对应于编码的IL格式的字节,异常表等.它不是用API做的,而是用老式的方式:一次写一个字节的代码.
之后,Delphi的内置链接器与IMetaDataEmit等一起生成元数据,IMetaDataEmit :: SetRVA用于告知代码将位于可执行文件中的元数据.使用IMetaDataEmit :: SaveToMemory复制元数据,然后将其复制到链接器已构建的PE中,并相应地修补CLR标头以指向元数据开始.
这是很多代码,其中一些是繁琐的,因为它的大部分内容都是通过Delphi现有的x86链接器进行的,它实现了分支优化和消除未使用的代码(智能链接),严格来说,.NET通常不需要这些代码. .
如果我们再次这样做,我们可能会完全避免使用.NET API来创建元数据,并直接从规范生成整个内容. API最终成为优化的黑盒子,并且累积了大量的编译时间.