【问题标题】:Has .Net IL changed at all since .Net 2.0?自 .Net 2.0 以来,.Net IL 是否发生了变化?
【发布时间】:2009-06-07 07:35:43
【问题描述】:

在 .Net 3.5 对其编译成的 IL 没有任何更改之前,我已经听说过这种说法。仔细考虑了我所知道的所有编译器特性,事实上,它们似乎都可以在同一个旧 IL 中实现,但我找不到官方来源来证实这一说法。是真的吗?

【问题讨论】:

  • 你问我为什么问?
  • 补充问题:我知道4.0肯定有一个新的CLR,但是它有什么IL变化吗?

标签: .net history cil


【解决方案1】:

认为没有任何 IL 更改,但是在 CLR 实现中进行了重大更改,以使动态方法更有效,允许表达式树编译等。我似乎记得围绕构建动态方法的安全性发生了变化,以使生成表达式树的 lambda 表达式即使在相对低信任的环境中也可以调用私有方法来工作。编译器知道调用私有方法是有效的,因为编译源代码的点可以访问它。但证明这一点很棘手:) 请参阅 this note by Eric Lippert

【讨论】:

  • IL 没有改变,但编译器会改变。例如,我们已经注意到,WCF 中的内部工具为代理等创建了完全不同的 C#,这反过来又会在编译时创建不同的 IL。另见 Soma 的日志条目 blogs.msdn.com/somasegar/archive/2006/05/18/601354.aspx 中关于“红色位”和“绿色位”的讨论。
【解决方案2】:

自 .NET 2.0 以来,随附的 CLR(版本 2.0.50727)没有更改,因此您的 IL 是相同的。 (另见this SO QA

【讨论】:

  • 不,CLR 本身已经发生了变化——我相信 .NET 2.0 SP1 的一部分是 CLR 变化。
  • 自最初的 .NET Framework 2.0 版本以来,2.0.50727 CLR 版本已经发布了多个版本。最初的 RTM 版本是例如版本 2.0.50727.42 。在我的机器(Vista SP2)上,完整版是 2.0.50727.4016 版。但是,AFAIK 自原始版本以来没有任何功能变化。
【解决方案3】:

..因此,如果您愿意,您可以在 .NET 2.0 项目中使用大量 .NET 3.5 功能,只要您使用最新的编译器:

  • 自动属性
  • 扩展方法(需要一些肮脏的技巧)
  • 对象初始化器
  • 类型推断(var 关键字)
  • Lambda 表达式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多