Versions of .NET

Release 5.2.0

  • Released on 2017-08-14

Release notes


Release History

  • - Service Release (12 September 2017)
  • - Stable Release (14 August 2017)
  • - Beta Release (01 August 2017)
  • - Beta Release (24 July 2017)
  • - Beta Release (12 July 2017)
  • - Beta Release (29 June 2017)
  • - Beta Release (15 June 2017)
  • - Alpha Release (11 May 2017)


In Depth

Strong assembly names

Mono will now optionally respect public keys and version numbers when loading strongly signed assemblies. If Mono is invoked with the --assembly-loader=strict option, then requests (whether via a static assembly reference, or using an assembly name using the reflection API) that include a public key token and version number will only load strong named assemblies with a matching token and name (respecting any bindings in relevant app config files).

To debug the assembly loading process, set the logging environment variables to trace level "info" or lower and trace filter to include "asm". (See Logging runtime events.)

The current default behavior is the same as in previous Mono versions. It is explicitly available with the --assembly-loader=legacy option.

Experimental Default Interface Methods Support

We added experimental support for the current prototype. Check the C# specs

Class Libraries


Multiple fixes and new intrinsics added. The library is now considered ready for general usage.

.NET Standard 2.0 groundwork

We've done all the groundwork to support libraries that conform to .NET Standard 2.0. Loading and running a library compiled against the 2.0 standard should work fine, tooling support (i.e. creating a .NET Standard 2.0 library) is still in preview though.

You'll need to install the .NET Core 2.0 SDK for tooling support as we use the MSBuild tasks which are installed as part of the .NET Core 2.0 SDK, similar to how Visual Studio/MSBuild on Windows does it.

Reference assemblies

The reference assemblies were updated to provide the .NET 4.7 API set.


mono command defaults to 64bit

The mono command now runs as a 64bit application by default. You can use the --arch=32 option to run Mono as 32bit again.

Optimized Array Stores

Added a fast path for storing on array of reference values when the stored value is of the same type of the array element type.

Class Initialization Improvements

Do hold any runtime locks while running the class initializer. This improves startup scalability.

Reduced minor collection pause times

Made the runtime tables used to store reflection information generational, so the GC can avoid scanning them during minor collections. Those tables can become significantly large on workloads like Visual Studio for Mac.

Interpreter passes the majority of the JIT test suite

Major progress was made on the interpreter front. It can now run non-trivial programs.


Internal Documentation

We continue to publish internal docs for mono, making it more convenient to browse and search the Mono runtime internals and associated documentation.

Static Analysis

In order to holistically improve the correctness and stability of Mono, we have been investing effort in custom static analysis tooling, which will be deployed as part of our continuous build to rule out certain classes of bugs. Recently we have made progress on minimizing the amount of manual annotation work required to add new analyses, making it easier for us to verify more properties of our code.

Mangler V1

Managed methods can include a dizzying array of attributes beyond the actual method code. The mangler encodes the attributes which are necessary to create a unique name for each method. If two methods mangle to the same string, they are the same method. This can be thought of as a primary key for each method, and extends to methods which are mono wrappers. Internally, mono is using it to build a deduplicating pass to remove binary bloat associated with generics.

Safer Getenv

The functions g_getenv and g_setenv are neither threadsafe nor reentrant. Subsequent calls to g_getenv can cause previous strings returned from it to point to garbage memory. This was leading to issues with System.Configuration that could be seen with HttpClient. Now we lock around these calls and return duplicated memory. This is a serious API change to g_getenv. The string returned must now always be freed. We don't expect many embedders to be using the version of eglib that is linked into mono for other functions. Those who do might want to check that this change does not introduce memory leaks.

Bug Fixes

  • #580 - Type.Load loads strong type despite version mismatch
  • #39444 - Action ReflectedType differs from Delegate ReflectedType for virutal methods
  • #43805 - Output of DateTime.Now() differs on Mono for ambiguous time period
  • #43988 - Stack overflow in System.Text.Encoding.Default
  • #46661 - Runtime exception filters truncate exception stack traces on NSLog
  • #46929 - Datetime error on
  • #47221 - Thread.Name can only be set once inside async callback
  • #47599 - HttpClient Transfer-Encoding:chunked is not added to the header - not able to transfer large files
  • #49721 - Assembly binder uses wrong strongly named assembly when same assembly with different version exists in local folder
  • #50529 - crash in thread-native-exit.exe
  • #51522 - Overload resolution fails for referenced assembly
  • #51561 - Getting process name of process running under higher privilege user throws exception
  • #51653 - mono_thread_info_wait_one_handle ignored alertable argument
  • #52086 - Nullable structs with implicit operators generate invalid IL code when compiling with Mono
  • #52294 - C# compiler reports an incorrect error in a lambda with generic constraints
  • #52340 - Compiler crashes with FATAL UNHANDLED EXCEPTION (nullref)
  • #52345 - Process has exited, so the requested information is not available
  • #52429 - Shutdown hang then crash in Finalizer thread
  • #52437 - Random NullReferenceExceptions in StringBuilder.ThreadSafeCopy
  • #52448 - StreamContent apparently needs to rewind stream before sending it
  • #52475 - MTOUCH: error MT3001: Could not AOT the assembly
  • #52511 - configure script doen't detect bad configuration
  • #52549 - error: mono_w32socket_convert_error: no translation into winsock error for (41) "Protocol wrong type for socket"
  • #52590 - Cannot compile for iOS, TypeBuilder exists in two places.
  • #52599 - await in finally clause prevents disposal of enclosing using statement
  • #52600 - Full AOT: Strange combination of structs, generics, and enums causes runtime failure
  • #52743 - denied loading problems
  • #52845 - [Cycle 9] Satellite assemblies not bundled when using "Bundle assemblies into native code" due to "unknown escape sequence" error from gcc during mkbundle step
  • #52866 - F# sprintf AOT bug still exists
  • #52899 - mprof-report missing filenames in coverage xml output when using portable pdbs
  • #53066 - Can't Build Project in Debug with "Could not AOT the assembly"
  • #53131 - Calling MakeArray() on a type with a rank that is too big does not throw an exception.
  • #53153 - Implement RuntimeHelpers::IsReferenceOrContainsReferences
  • #53166 - Application crashes when setting a get-only property in constructor
  • #53196 - List<>.Sort() using insertion sort does not sort all values when equality isn't checked.
  • #53202 - Number minus Enum gives wrong value
  • #53231 - csc doesn't unify same file passed multiple times when one path is relative
  • #53278 - Two coreclr SIMD test failures (one regression from 4.8)
  • #53334 - es-US Culture wrong number formatting
  • #53684 - Crash when enumerating directory and selecting the first file
  • #53689 - [Test] Certificate7 disabled due to SecCertificateCreateWithData does different things on 10.11 vs 10.12 with invalid certificates
  • #53792 - CFNetworkHandler reports correct download when internet connection is lost during request
  • #53843 - Mono deadlocks on shutdown while waiting for a process which has died
  • #53890 - Regression: Native crash while running tests with xunit with mono 2017-02 branch, works with
  • #54212 - Mono allows casts of non-zero bound array to zero bound array
  • #54322 - await in catch-block inside a loop causes the same exception to be caught multiple times
  • #54448 - Unable to revert to thread-local storage for CurrentThread.CultureInfo
  • #54485 - Creating an open generic type with recurrent constraint fails
  • #54991 - Cannot compile get => _text
  • #55041 - Stripping mscorlib in simple example changes IntPtr (5) behavior?
  • #55083 - coreclr test fails after 6f33b62f39a273fccb78f71513cb5e0dfb987c70
  • #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
  • #55681 - System.Reflection.Emit.ModuleBuilder.build_metadata bug when running FAKE's test suite
  • #56081 - Returning a valuetype from an async method with an awaited parameter yields a Mono.CSharp.InternalErrorException: Await yields with non-empty stack
  • #56240 - Performance Degradation When Using Expressions
  • #56247 - Enumerable.OrderByDescending behaves differently on LLVM FullAOT
  • #56275 - Unable to copy appname.dll from obj to bin because it is being used by another process
  • #56493 - Windows MMAP doesn't release file
  • #56567 - Passing large struct into exception filter method crashes runtime with SIGSEGV
  • #56611 - Regression: ArrayTypeMismatchException when running F# script
  • #56694 - Assertion: should not be reached at d:\j\workspace\v\repos\mono\mono\sgen\sgen-scan-object.h:91
  • #56821 - Static ctor of MarshalByRefObject runs in primary AppDomain
  • #56824 - Runtime crash with VSMEF
  • #57222 - System.Reflection.AmbiguousMatchException for two fields with same name but different types
  • #57744 - ReflectionTypeLoadException.LoaderExceptions has null exceptions


Aaron Bockover, Adrian Cheng, Aleksey Kliger, Alexander Köplinger, Alexander Kyte, Alexis Christoforides, Andi McClure, Andoni Morales Alastruey, Ankit Jain, Bernhard Urban, Brian Raderman, Calvin Buckley, Chris Hamons, Cody Russell, Damien Diederen, Daniel C. Weber, David Karlaš, Dean Ellis, Eberhard Beilharz, Edward Betts, Egor Bogatov, Filip Navara, Francois Botha, Frederik Carlier, Jan-Joost Spanjers, Jb Evain, Johan Lorensson, Jonathan Chambers, Jonathan Pryor, Jon Purdy, Ludovic Henry, Luis Aguilera, Manuel de la Pena, Marcin Cieślak, Marek Habersack, Marek Safar, Martin Baulig, Mathieu Bourgeois, Michael DeRoy, Miguel de Icaza, Mikayla Hutchinson, Neale Ferguson, Niklas Therning, Nikolay Amiantov, Jaymin Patel, Rodrigo Kumpera, Rolf Bjarne Kvinge, Pei Su, Vincent Povirk, Vlad Brezae, Vladimir Kargov, Vladimir Kazakov, Zoltan Varga