gpt4 book ai didi

.net - 有哪些方法可以从非托管代码生成 MSIL

转载 作者:行者123 更新时间:2023-12-03 14:57:43 26 4
gpt4 key购买 nike

我正在尝试为 .NET 平台创建我的语言的后端。前端和解释器用Delphi编写。非托管 API 只允许类型定义,但不允许发出 MSIL。

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

最佳答案

Delphi 的 .NET 代码生成器将 IL 作为字节码直接发出到内存中,与 x86 代码生成非常相似,尽管具有适当的 header 等。也就是说,代码生成器直接发出与编码的 IL 格式相对应的字节、异常表等。它不是使用 API 来完成此操作,而是使用老式的方式:一次编写一个字节的代码。

随后,Delphi 的内置链接器与 IMetaDataEmit 等一起生成元数据,并与 IMetaDataEmit::SetRVA 告诉元数据代码将位于何处在可执行文件中。元数据使用 IMetaDataEmit::SaveToMemory 复制出来,然后复制到链接器已经构建的 PE 中,并相应地修补 CLR header 以指向元数据开始。

它有很多代码,其中一些很繁琐,因为其中大部分是通过 Delphi 现有的 x86 链接器进行线程化的,该链接器可以执行诸如分支优化和消除未使用的代码(智能链接)之类的事情,严格来说,这通常是不必要的对于.NET。

如果我们重来一遍,我们很可能会避免使用 .NET API 创建元数据,并直接根据规范生成整个内容。这些 API 最终成为优化的黑匣子,并且增加了大量的编译时间。

关于.net - 有哪些方法可以从非托管代码生成 MSIL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3222328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com