问题来源
我最近的一个项目是用 C# 语言开发的。该项目主要分成以下几个部分:
- 运行在 SUSE Linux Enterprise Server 11 SP1 操作系统下的 MySQL 5.5.23 数据库。
- 运行在 SUSE Linux Enterprise Server 11 SP1 操作系统下的后台批量程序,这是通过 corntab 自动定时调度运行的。
- 运行在 Microsoft Windows Server 2003 R2 SP2 操作系统下的 ASP.NET 4 网站,绝大多数人员通过访问该网站使用本项目。
- 运行在 Microsoft Windows XP 等操作系统下的客户端程序,只有少部分人员需要该客户端程序。
这个项目使用 Microsoft Visual Studio 2010 SP1 IDE 进行开发。而后台批量程序则是将相关的源程序拷贝到 Linux 操作系统下,然后使用 Mono 的 xbuild 命令进行编译。
原来一切都很正常。但是,有一天在使用 Mono 的 xbuild 编译时,Mono C# compiler 居然崩溃了。我大吃一惊,还以为是修改代码时使用了 Mono 不支持的 C# 的功能。后来经过仔细查找,才发现是 Mono C# compiler 的一个小小的 bug 导致的。
Bug 描述
我们有以下 Tester.cs
1 static class Tester 2 { 3 static void Main() { } 4 static void Test(decimal value = 0) { } 5 }
这是一个非常简单的 C# 程序。使用 Microsoft C# 编译器编译一切正常。如果使用 Mono C# compiler 2.10.x 编译的话,会导致 Mono C# 编译器崩溃,如下所示:
ben@vbox:~/work> dmcs --version Mono C# compiler version 2.10.6.0 ben@vbox:~/work> dmcs Tester.cs we can't encode valuetypes, we should have never reached this line Stacktrace: at (wrapper managed-to-native) System.Reflection.Emit.TypeBuilder.create_runtime_class (System.Reflection.Emit.TypeBuilder,System.Reflection.Emit.TypeBuilder) at System.Reflection.Emit.TypeBuilder.CreateType () at Mono.CSharp.TypeContainer.CloseType () at Mono.CSharp.ModuleContainer.CloseType () at Mono.CSharp.Driver.Compile () at Mono.CSharp.Driver.Main (string[]) at (wrapper runtime-invoke) .runtime_invoke_int_object (object,intptr,intptr,intptr) Native stacktrace: /usr/bin/mono() [0x493dda] /lib64/libpthread.so.0(+0xfd00) [0x7fdfb28eed00] /lib64/libc.so.6(gsignal+0x35) [0x7fdfb2583d95] /lib64/libc.so.6(abort+0x17b) [0x7fdfb25852ab] /usr/bin/mono() [0x5ccb4f] /usr/bin/mono() [0x5ccbd2] /usr/bin/mono() [0x4f594e] /usr/bin/mono() [0x4fcafe] /usr/bin/mono() [0x4fd4c4] /usr/bin/mono() [0x50273e] /usr/bin/mono() [0x50c3ff] [0x4119ebac] Debug info from gdb: ================================================================= Got a SIGABRT while executing native code. This usually indicates a fatal error in the mono runtime or one of the native libraries used by your application. ================================================================= Aborted ben@vbox:~/work>
向 Mono 开发团队提交 Bug
我已经于 2012-04-02 将这个 bug 提交给 xamarin.com,即 Bug 4184: C# method optional argument is decimal type, C# compiler aborted.。 处理该 bug 的 Marek Safar 答复说:Already fixed in master and Mono 2.11。在我的提问下,他进一步解释说:
master is the latest mono code from github.
Mono 2.10.* has not been fixed. Upgrade to Mono 2.11
也就是说,目前 Latest Stable Version 的 Mono C# compiler 中还是有这个 bug 的。在 Alpha Version 的 Mono C# compiler 中才修复了这个 bug。
目前的解决方案
以下 C# 程序不会引起 Mono C# compiler 2.10.x 崩溃:
1 static class Tester 2 { 3 static void Main() { } 4 static void Test(decimal value = 0m) { } 5 }
注意上述源程序中第 4 行将 Test 方法的 decimal 类型的可选参数 value 初始化为 0m,而不是初始化为 0。
检验 Mono C# compiler 2.11.1 是否解决该bug
为了证实 Mono C# compiler 2.11.x 已经修复了这个bug,我下载并安装了 mono 2.11.1,如下所示:
ben@vbox:~/src> wget http://download.mono-project.com/sources/mono/mono-2.11.1.tar.bz2 ben@vbox:~/src> tar xjf mono-2.11.1.tar.bz2 ben@vbox:~/src> cd mono-2.11.1 ben@vbox:~/src/mono-2.11.1> ./configure --prefix=/opt/mono-2.11.1 ben@vbox:~/src/mono-2.11.1> make ben@vbox:~/src/mono-2.11.1> sudo make install ben@vbox:~/src/mono-2.11.1> cd ~/work ben@vbox:~/work> /opt/mono-2.11.1/bin/mcs --version Mono C# compiler version 2.11.1.0 ben@vbox:~/work> /opt/mono-2.11.1/bin/mcs Tester.cs ben@vbox:~/work>
果然OK了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
2009-04-24 Ubuntu 9.04 安装和配置备忘录