【问题标题】:What options do i have for generating .net bytecode?我有哪些选项可以生成 .net 字节码?
【发布时间】:2012-03-23 16:22:41
【问题描述】:

我更喜欢 API 方法而不是通过 CIL。有没有我可以使用的高级框架,或者我应该使用 Reflection.Emit?

更新

在进一步探索中,我注意到对于 Mono mcs.exe C# 编译器后端使用的内容存在(可能)相互矛盾的解释。 Some 说“Mono C# 编译器通过使用 System.Reflection.Emit API 生成 ECMA CIL 图像”而 elsewhere 表示截至 2011 年 9 月 mcs 正在使用 IKVM .NET implementation 用于生成字节码。

【问题讨论】:

  • C# 是一个相当“高级框架”,用于生成 CIL :)
  • 太模糊了。也许cciast.codeplex.com
  • 抱歉没有详细说明 - 我在颠簸的公共汽车旅行中迅速在手机上写下了它。我的意思是 Compiler 标记表明我需要将此框架用作编译器的代码生成后端。

标签: .net compiler-construction code-generation cil


【解决方案1】:

这在很大程度上取决于您要达到的目标。在不了解您的特定情况的情况下,很难为这项工作推荐合适的工具。

如果您需要在运行时生成动态方法,Reflection.Emit 非常适合。如果您要修改您的程序集,请查看Mono.Cecil。请记住,所有这些工具都需要了解 .NET 元数据和 MSIL。

但是,如果您尝试做一些需要检查或修改类型或方法的事情,您可能需要查看像 PostSharp 这样的 AOP 解决方案。它会让你在比 MSIL 更高的层次上表达这些需求。

同样,这在很大程度上取决于您的用例。

免责声明:我在 PostSharp 的创建者 SharpCrafters 工作

【讨论】:

  • 我正在考虑为编译器创建后端代码生成。我当然可以生成文本 IL,但宁愿能够直接流式传输到字节码,而不是必须有一个额外的通道来转换 IL。
  • 因此,像 postsharp 这样的 IL 重写器或基于 C# 的框架强加特定形式的语义可能不适合我的需要。
【解决方案2】:

字节码不是高级别的。如果你想在高层次上生成字节码,用合适的语言编写,并使用编译器...... :)

如果你想生成字节码,它是按定义低级的。

你想达到什么目的?也许可以使用除 IL 发射之外的其他技术?在 .net 中,有很多方法可以在不使用 IL 的情况下操作类运行时。

【讨论】:

  • 有一些抽象级别略高的辅助 API 来协助发出 IL/字节码。我记得几年前在代码项目中提到过一个,但我记不起名字了。它可能在几年前就被遗弃了。
猜你喜欢
  • 2020-01-27
  • 2021-10-10
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2019-04-08
  • 2021-06-20
相关资源
最近更新 更多