在切换到Visual Studio 2015之后,我们注意到在Roslyn中对lambdas编译到MSIL的方式所做的一些更改(在本线程和GitHub上进行了描述)在某些情况下会导致运行时故障。
由于Roslyn显然是.NET的未来,我们希望切换到这项技术,但似乎所有在生产中运行的遗留代码(我们有相当程度的信心它能正常工作)现在都容易出现新的运行时故障。这些库也受到了这个问题的影响(例如Moq)。
由于RyuJIT的问题,我们已经跳过了升级,但我相信Visual Studio 2015与Roslyn进行了大量集成,我认为我们不能简单地手动替换csc.exe
(但这是另一个问题)。
那么,是否有一份Roslyn中突破性变化的汇编列表,我们可以参考它来看看我们能期待什么?
(更新)
感谢@NealGafter提供链接。目前可以在这里找到突破性变化的列表:
- Roslyn Github第7278期:Roslyn的突破性变化列表
这里似乎应该有一些文档:Roslyn编译器规范(GitHub上的Roslyn/docs/compilers)。根据描述:
编译器规范详细说明了Roslyn VB和C#编译器的支持(和半支持)表面积。这包括
- 命令行开关及其含义
- 打破对以前版本编译器的更改
- (故意)违反规范的编译器行为
- 语言规范中未描述的编译器功能
- COM特定功能和其他Microsoft特定功能
- 影响编译器行为的"众所周知"属性
- "规则集"文件的语法和语义
- 例如,C#和VB之间的互操作性所包含的功能
- 命名索引器使用来自C#
- 编译器行为偏离语言规范的地方
- 限制(例如标识符长度)
- 每个版本的语言更改历史记录
描述对CodeGen关于lambdas的更改的文档(因为这是我的初始问题)位于roslyn/docs/compilers/CSharp/CodeGen Differents:
非提升Lambda表达式现在作为实例方法在单例显示类上实现。由于委托的入口点是实例"Invoke"方法,因此在运行时将委托调用调度到底层实现方法会更便宜,前提是该方法也是具有与"Invoke."完全相同的形式签名的实例方法。