【问题标题】:List of breaking changes in RoslynRoslyn 中的重大更改列表
【发布时间】:2015-11-27 09:58:13
【问题描述】:

切换到 Visual Studio 2015 后,我们注意到 Roslyn 中对如何将 lambda 编译为 MSIL 的一些更改(在 this threadon GitHub 中进行了描述)在某些情况下会导致运行时失败。

由于 Roslyn 显然是 .NET 的未来,我们希望切换到这项技术,但似乎所有已经在生产环境中运行的遗留代码(并且我们有相当程度的信心它可以正常工作)都是现在容易出现新的运行时故障。这些也是受此问题影响的几个库(例如Moq, for example)。

我们已经为 its issues 跳过升级到 RyuJIT,但我相信 Visual Studio 2015 与 Roslyn 高度集成,我认为我们不能简单地手动替换 csc.exe(但那是 a different question)。

那么,Roslyn 中是否有一个重大变化的编译列表,我们可以参考这些列表来看看我们可以期待什么?

【问题讨论】:

  • 这可能会有所帮助:github.com/dotnet/roslyn/wiki/API-Changes
  • @nawfal:这个页面似乎显示了 Roslyn API 的变化,我对生成的 MSIL 相对于以前的 VS 版本中的 csc.exe 的变化更感兴趣。
  • 我认为,您目前在任何地方都找不到这些更改。你应该关注this GitHub issue,它与 lambdas 的变化有关。
  • 我们正在 github.com/dotnet/roslyn/issues/7278 的 roslyn 存储库中跟踪这个问题
  • @Neal:我在the answer below 中找到了包含一些信息的链接。不确定这是否是“规范”文档,但似乎接近它。我还考虑编译一个“待办事项迁移列表”,以在我的其他项目中查找可能会中断的内容(例如围绕代码调用 Delegate.CreateDelegate,检查 lambdas 上的 IsStaticTarget 属性等),但我不确定这个列表是否至少可以涵盖大部分问题。

标签: visual-studio-2015 roslyn csc


【解决方案1】:

(更新)

感谢@NealGafter 提供链接。目前可以在此处找到重大更改列表:


似乎有些文档应该在这里:Roslyn Compiler Specification (roslyn/docs/compilers on GitHub)。根据描述:

编译器规范详细说明了 Roslyn VB 和 C# 编译器支持(和半支持)的表面积。这包括

  1. 命令行开关及其含义
  2. 与以前版本的编译器相比的重大更改
  3. (故意)违反规范的编译器行为
  4. 语言规范未描述编译器功能
    • COM 特定功能和其他 Microsoft 特定功能
    • 影响编译器行为的“众所周知”属性
    • “规则集”文件语法和语义
  5. 包括用于 C# 和 VB 之间互操作性的功能,例如
    • 在 C# 中使用命名索引器
  6. 编译器行为偏离语言规范的地方
  7. 限制(例如标识符长度)
  8. 每个版本的语言更改历史记录

描述 CodeGen 关于 lambda 的更改的文档(因为这是我最初的问题)位于 roslyn/docs/compilers/CSharp/CodeGen Differences

非提升 Lambda 表达式现在被实现为单例显示类的实例方法。由于委托的入口点是实例“Invoke”方法,如果该方法也是具有与“Invoke”完全相同的形式签名的实例方法,则在运行时将委托调用分派给底层实现方法会更便宜。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2013-09-27
相关资源
最近更新 更多