Mono 5.4.0 Release Notes

Release date: 05 Oct 2017

Release History

  • - Service Release (31 October 2017)
  • - Stable Release (05 October 2017)
  • - Beta Release (26 September 2017)
  • - Beta Release (11 September 2017)
  • - Alpha Release (28 August 2017)
  • - Alpha Release (02 August 2017)


In Depth


JIT Job Control

The Runtime now controls concurrent method compilation. It avoid multiple threads compiling the same method at the same time and limits the number of threads simultaneously compiling.

This shows up as performance issue with applications such as Roslyn that very quickly ramp up a lot of threads.

Array element store optimization

Optimize array stores of non-final ref types.

Load scalability improvements

Move a few hot data structures in the type loader to use lock free reads. This shown up a scalability botheneck with Roslyn and Visual Studio for Mac first project load.

ValueType write barrier optimization

Optimize GC write barriers when value types are involved. This shown up as a performance issue with Roslyn.

Make jit method table resizing more scalable

The original table resizing code would count the size of the table on resize, this works fine for small programs but proved to be a problem with Visual Studio for Mac.

Reflection queries scalability improvements

Reflection queries must be cached by the runtime as two identical queries must return the same objects. It now use a lock free data structure for reads. This shown up as a performance issue during Visual Studio for Mac first project load.

Intrisificy Marshal.PtrToStruct for blitable types

This avoid boxing and unboxing an intermediary object. This results in a 30x speedup on a microbenchmark.

Revamped unaligned memory access support

As part of our work to support dotnet platform advances, proper unaligned access was missing from the mono runtime. This feature is used by the new Span type and now it works with ARM cpus.

Interpreter works in JIT restricted environments

There are a few things in the interpreter that still require machine specific trampolines that are written in assembly or managed code. We used the JIT infrastructure so far for that, but now we added plumbing to the AOT compiler so they can be pre-generated, and thus the interpreter is usable on platforms where code generation is not allowed during execution. See the interp option in the man page.

Interpreter supports ARM and ARM64

We added support for those architectures and also test them on CI.

Class Libraries

Integrated AppContextSwitch code from reference sources which allows all of its compat switches to be used.

Added reference assemblies for .NET Framework 4.7. This allows you to build libraries targetting .NET 4.7 using Mono’s msbuild.


We updated the NuGet command line tool (nuget) which is bundled with Mono to version 4.3.0.

We updated MSBuild to the latest 15.4 release.

Bug Fixes

  • #580 - Type.Load loads strong type despite version mismatch
  • #17325 - RealProxy returns MarshalByRefObject for an Interface instead of the real interface type
  • #44907 - Applications crash on Nexus 9 devices only since Xamarin.Android
  • #46482 - SIGSEGV at random code lines after application start on Nexus 9 with Xamarin Android 7
  • #51791 - [XA] HTC Nexus 9 - app closes on launch.
  • #52508 - TLS SignalR Self-host Hang
  • #53038 - SRE should fail more gracefully when SymbolWriter is missing
  • #53202 - Number minus Enum gives wrong value
  • #53244 - mcs generates ParamArrayAttribute when specifying “params” in overridden method where base doesn’t have it
  • #53792 - CFNetworkHandler reports correct download when internet connection is lost during request
  • #54159 - Compiler crashes when calling method named Finalize
  • #54322 - await in catch-block inside a loop causes the same exception to be caught multiple times
  • #54388 - InternalsVisibleTo is case sensitive
  • #54448 - Unable to revert to thread-local storage for CurrentThread.CultureInfo
  • #54485 - Creating an open generic type with recurrent constraint fails
  • #54658 - [iOS]BCL test failed with Assertion failures error: * Assertion at /Users/builder/data/lanes/4691/6bea7a5b/source/xamarin-macios/external/mono/mono/mini/aot-runtime.c:2924, condition `!async’ not met and condition `unwind_options == MONO_UNWIND_NONE’ not
  • #54976 - [iOS]fsharp test failing on iOS device with Assertion at /Users/builder/data/lanes/4691/9245c1c0/source/xamarin-macios/external/mono/mono/mini/mini-arm-gsharedvt.c:220, condition `src_slot < 16’ not met
  • #54991 - Cannot compile get => _text
  • #55041 - Stripping mscorlib in simple example changes IntPtr (5) behavior?
  • #55083 - coreclr test fails after 6f33b62f39a273fccb78f71513cb5e0dfb987c70
  • #55095 - Breakpoints not hit for ASP.NET MVC Project
  • #55348 - “using static” results in invalid compiler errors
  • #55400 - MCS produces incorrect code for generic instantiated with a gtd
  • #55436 - System.Runtime refuses to load with strict naming
  • #55577 - SIMD instructions with System.Numerics.Vectors do not work
  • #55603 - Follow-up to bug 52845: Satellite assemblies not loaded by app when using “Bundle assemblies into native code” even though they are now successfully mkbundled
  • #55604 - Incorrect struct size when using property setter
  • #55697 - .NET 2.0 style web services fail to build under msbuild in Release but work with xbuild
  • #56081 - Returning a valuetype from an async method with an awaited parameter yields a Mono.CSharp.InternalErrorException: Await yields with non-empty stack
  • #56111 - Hitting assertion after enabling AOT+LLVM on x86 devices in tramp-x86.c:124
  • #56202 - [mono-2017-04]Apps fail to launch on 32 bit device with error EXC_ARM_DA_ALIGN at 0x0142ccec
  • #56240 - Performance Degradation When Using Expressions
  • #56242 - TypeTest.GetGenericMethodDefinitionOverInflatedMethodOnGTD throws NRE on Android in Release mode
  • #56247 - Enumerable.OrderByDescending behaves differently on LLVM FullAOT
  • #56452 - Problem Stack too big
  • #56462 - Custom operator causes internal compiler error
  • #56493 - Windows MMAP doesn’t release file
  • #56499 - DateTime.Now throws exception if /etc/localtime symlink destination missing
  • #56567 - Passing large struct into exception filter method crashes runtime with SIGSEGV
  • #56611 - Regression: ArrayTypeMismatchException when running F# script
  • #56616 - Missing CS1629 for unsafe code in iterators
  • #56627 - mcs inherits interface implementation, while csc doesn’t
  • #56684 - (mono-2.0-sgen.dll) in mono.exe: 0xC0000005: Access violation reading location 0x04FA3D9A.
  • #56694 - Assertion: should not be reached at d:\j\workspace\v\repos\mono\mono\sgen\sgen-scan-object.h:91
  • #56814 - Xamarin.Mac.dll Memory Leak starting with Release
  • #56821 - Static ctor of MarshalByRefObject runs in primary AppDomain
  • #56824 - Runtime crash with VSMEF
  • #57002 - New bockbuild package is missing .dSYM directories
  • #57222 - System.Reflection.AmbiguousMatchException for two fields with same name but different types
  • #57232 - Compiler error when using ternary operator and no whitespace
  • #57242 - [StructLayout (LayoutKind.Sequential, Pack = 1)] doesn’t work as expected
  • #57301 - Running IronPython’s executable under Mono 5.0.x causes a SIGSEGV on exit, this did not happen on 4.8
  • #57496 - [Slovenian CultureInfo + others] .Parse throws exception when parsing negative values
  • #57505 - Missing error CS0165 in presence of commented line
  • #57629 - [io-layer] File.Delete () throws System.UnauthorizedAccessException on non-existing files on a read-only path
  • #57691 - InternalsVisibleTo doesn’t work with 2048-bit SNK files
  • #57744 - ReflectionTypeLoadException.LoaderExceptions has null exceptions
  • #57771 - F#.NET Core 2.0 projects do not compile
  • #57796 - Compiler Crash instead of CS1621
  • #57850 - Mono assertion when ResolveEventHandler returns a reflection-only assembly
  • #57851 - Assertion if using ResolveEventHandler to find custom attributes
  • #57930 - Building netstandard 2.0 project throws DllNotFoundException: hostfxr during msbuild
  • #57959 - SIGSEGV in roslyn with corrupted stack
  • #58114 - [llvm] csc (Rolsyn) produce fault clauses that the llvm backend does not support
  • #58210 - “* Assertion at metadata.c:1048, condition `index < meta->heap_strings.size’ not met” is output on startup - works fine on Windows
  • #58344 - SIMD crash using System.Numerics.Vector
  • #58361 - EnumBuilder can no longer be used to generate IL code
  • #58399 - Delegates as collection key are ~500x slower than previously
  • #58421 - sre-save.c asserts in fixup_method () if TypeBuilder token is used across assemblies
  • #58446 - [iOS]EnumerableMoreTest.ConcatArgumentNullTest crash on tvOS device
  • #58454 - Cannot resolve method Subscription`1 Subscribe[TSelection](System.Func`2[TState,TSelection], System.Action`2[TSelection,TState]) because the declaring type of the method handle FSI_0002+Store`1[TState] is generic. Explicitly provide the declaring type to
  • #58738 - System.IO.MonoIO.Read - Native Crash when device file is gone
  • #58782 - Exception stack traces are deleted when reaching the native-to-managed wrapper in a reverse invoke
  • #58829 - Application Output Window being flooded with “[Mono] worker parking, [Mono] worker unparking” messages when debugging agasint Android Emulator.
  • #59235 - [mono-2017-06] android.runtime.JavaProxyThrowable: System.ObjectDisposedException: Cannot access a disposed object.
  • #59274 - [Mac]A crash report is generated on closing mac apps


Aleksey Kliger, Alexander Köplinger, Alexander Kyte, Alexis Christoforides, Alex Rønne Petersen, Andi McClure, Ankit Jain, Bernhard Urban, Bill Holmes, Cody Russell, Damien Diederen, David Karlaš, David Naylor, Dean Ellis, Egor Bogatov, e-kovalenko, Frederik Carlier, Jan-Joost Spanjers, Jason Imison, jmserrano, Jochen Kühner, Johan Lorensson, Jonathan Chambers, Jonathan Pryor, Jo Shields, Josh Peterson, Julius Vitkauskas, Katelyn Gadd, Ludovic Henry, Manuel de la Pena, Marcin Cieślak, Marek Habersack, Marek Safar, Marius Ungureanu, Martin Baulig, Matthew Leibowitz, Michael DeRoy, Miguel de Icaza, Mikayla Hutchinson, Niklas Therning, nosami, Rodrigo Kumpera, Rolf Bjarne Kvinge, Sebastien Pouliot, Vincent Povirk, Vlad Brezae, Vladimir Kargov, Zoltan Varga