The 6.14.0 release of Framework Mono is now available.

This is the first release of Framework Mono from its new home at Winehq. It includes work from the past 5 years that was never included in a stable release because no stable branch had been created in that time. Highlights are native support for ARM64 on macOS and many improvements to windows forms for X11.

The current set of supported platforms is:
* Linux: x86[3], amd64[1], arm64[3]
* macOS: amd64[2], arm64[2]
* Windows: x86[3], amd64[3]
[1] Tested manually and automatically through GitLab CI.
[2] Tested manually only, no CI implemented yet.
[3] No testing process yet.

Linux armv5te is known to be broken, but a work-around is possible by disabling float optimizations. I am hoping to fix that in the near future.

Binary packages are not currently available. The source is available at https://dl.winehq.org/mono/sources/mono/mono-6.14.0.tar.xz

There has also been a release of libgdiplus, version 6.2, with source code available at https://dl.winehq.org/mono/sources/libgdiplus/libgdiplus-6.2.tar.gz, which did not get its own announcement at the time.

Since this is the first release at Winehq, I wanted to give a detailed report on where this project is and what my priorities are. I'm including that below.

# What's New in 6.14.0

* Native support for macOS on ARM. Cis-compilation on ARM macOS is now assumed to be compiling for macOS, not cross-compiling for iOS.
* System.Windows.Forms:
  * Fixed various resource leaks on X11.
  * Redesigned Clipboard and Drag And Drop implementation on X11.
  * Stability improvements on X11.
* Improved support for generated COM interfaces.
* Fixed some common cases where processes would hang on exit.
* Added Georgian translation.
* Many warning fixes. The Linux amd64 build no longer warns when compiling the C portion of the codebase, and this is enforced for new changes via CI.
* Many bug fixes.

# A Note on Terminology

There are at least 3 different related projects using the name Mono:
* Framework Mono is the project previously hosted at https://github.com/mono/mono, which was then simply called Mono. I have made this change to distinguish it from "monovm" and "Wine Mono", which are different projects. Framework Mono is a cross-platform runtime compatible with .NET Framework.
* "monovm" is a separate fork of the Mono runtime that's part of modern .NET and can be used instead of CoreCLR.
* "Wine Mono" is a downstream distribution based on Framework Mono that is used in Wine to replace .NET Framework.

There are also at least 2 different related .NET projects using 3 different names:
* .NET Framework is a proprietary Windows component that supports cross-platform executable code using an object-oriented model.
* .NET Core was an open-source project supporting many of the same languages and APIs as .NET Framework but mostly incompatible with it. .NET Core was renamed to ".NET" when version 5 was released. I call it "modern .NET" to distinguish it from .NET Framework.

# My Goals

For those not aware, in February of 2024, I made a fork of Framework Mono at Winehq (https://gitlab.winehq.org/mono/mono/-/tree/main). In August, Winehq took over the project officially, with me as maintainer, and this fork became the project's official home (https://github.com/mono/mono/issues/21796).

I approach this project with very different motivation and resources from the previous team. I am not trying to sell it to anyone as a development platform. I do not have a dedicated team for this effort. My employer is supportive, but I have other responsibilities, and I've found that for my own mental health I have to switch frequently between different projects.

I mention this because I think it's important for people to understand where I'm coming from, so they can get some idea of why I prioritize the things I do, and why certain things are missing.

My main goal is to keep Mono working the way it has been, on desktop platforms. For a project of this complexity, that takes consistent effort, because other software it needs to interact with is updating, and sometimes those updates will break things. Personally, I use Mono to run KeePass natively on Linux, and as a target platform for a program I am developing called Xalia.

I want to provide a space for people who want to contribute. I don't like watching contributions get lost simply because no one is there to review them, which was a frequent occurrence on GitHub.

Selfishly for my employer, I want Wine Mono to have a functioning upstream. I have to continue working on Wine Mono to improve its compatibility with Windows. Wine Mono is a fork of cross-platform code designed only to work on a single implementation of a single platform. The longer I keep to that narrow focus, without anyone working on the other platforms, the worse that codebase will get. I believe that maintaining code for multiple platforms makes it cleaner, and this is worth it even for Wine Mono alone.

# What we lost in the Winehq Migration

## Clarity for Users and Contributors

The announcement in August was confusing and still lacks visibility. People regularly show up on GitHub and file issues and pull requests without realizing the project has moved. I do keep an eye on these, and I respond or transfer contributions where appropriate, but it's not ideal. GitHub doesn't have the latest version of the code, at least not at the old URL (I have created an official mirror at https://github.com/wine-mono/mono), so they may duplicate effort or write changes that conflict with the latest version. Archiving the repository was suggested as a solution, but I worry that contributions would be lost if people can't immediately file them.

There doesn't seem to be any way to add a banner to the top of the project page. Redirects are only possible by transferring the repository to another organization on GitHub, and I can't do that because of concerns about protecting the data currently on that repository. Those concerns are also the reason I can't mirror updates to the original repository on GitHub.

Anyway, if you want to get the latest development version of the source code, or file an issue or merge request, use this link: https://gitlab.winehq.org/mono/mono

## Official Binaries

The infrastructure used to build binaries for Mono was not transferred to Winehq (and I doubt we could maintain it if it had been). For us to supply binaries, someone needs to recreate that on Winehq's infrastructure (probably GitLab jobs). I haven't been able to do that yet.

It'd be really nice for macOS in particular because there haven't been any ARM binaries released yet.

## Platform Support

Mono supported a lot of different platforms and CPU architectures. I have neither the knowledge, time, nor hardware to support all of them. I figure Web Assembly, Android, and iOS are already covered by modern .NET, and in Mono they lack the specific advantage of binary compatibility with .NET Framework. Therefore, I am focusing on the most common desktop platforms and the CPU architectures that could run Mono. (Notably, I believe Windows on ARM would be worth supporting, but Mono hasn't yet been ported to it, and this would likely be a non-trivial effort that I don't currently have the resources for.)

I don't plan to intentionally break the other targets, but I also cannot currently test them, so they may unintentionally break. If someone has a use case for some other target, and is able to maintain it (or at least add CI support so I have a way to tell when it's working), then I'd be open to supporting it. In particular, the Linux armv5te platform is broken, and I know that someone is depending on it, so I am hoping to fix it and add support in the future.

## Testing and Continuous Integration

The old Mono GitHub had CI for a dizzying array of platforms and configurations. On Winehq GitLab, our CI currently supports amd64 Linux and no other platforms. I would really like to have CI for all the supported CPU/operating system combinations. I'd intended to get it done before this release, but that ended up taking so much of my time that I had to just set it aside for a while. I'm hoping to get back to it soon.

## Crash Reporting (MERP)

The Crash Reporting (MERP) feature was causing test failures on macOS. I have been advised by the previous maintainers that this feature was probably only used by Microsoft for their own projects, and that flaws in the approach made it not worth maintaining. Microsoft has, of course, moved on, and I couldn't find any indication of anyone else using this. It also required an external reporting tool that is proprietary to Microsoft. It's likely possible for a third party to create their own implementation, but again, I couldn't find any indication that anyone had done this.

Specifically, MERP did crash reporting in a manner similar to WER (Windows Error Reporting). Its major design flaw is that it attempted to produce crash reports from inside the process that had crashed. If a process crashed, it's likely that the state is corrupted, and this corruption would often cause MERP to fail to produce a report. To mitigate this, a complex "breadcrumbs" system was implemented in MERP so that, if it fails to gather crash information for a report, it can at least report that it failed to gather the crash information, but such reports do not help with understanding either the original crash or the MERP failure. Making this work properly would require a redesign using an external process that monitors an application for crashes and handles crash reporting.

The "Mono.Runtime" methods that configure MERP and check for crashes are now no-ops. Related methods that query information outside of a crash throw PlatformNotSupportedException.

# My Current Priorities

## Fix armv5te Platform

See https://gitlab.winehq.org/mono/mono/-/issues/7. Since there is a work-around available, I'm hoping for a simple solution by detecting the platform capabilities. It may also be possible to add this platform to CI using QEMU.

## Update Cryptography

Mono uses BoringSSL for its cryptography. It was forked in 2016, and since then it has never been updated from upstream. The fork contains hacks that remove a dependency on the Go programming language.

My understanding is that updating simply isn't practical. Some people have apparently had success with resetting to the newest version, but I've since been told that only rebuilds work, not clean builds, so there's no telling what kind of strange hybrid that creates. It's no longer practical to remove the Go dependency. Upstream also explicitly recommends against any third party using BoringSSL, because they have no guarantees of API or ABI stability.

I'm not an expert in computer security, but using an 8 year old fork of a cryptography library that's impossible to update is, in my uneducated opinion, very bad. I would like to replace BoringSSL with something modern, and preferably dynamically linked so it can be more easily updated, probably OpenSSL.

## Expand the CI

I would like to have CI for all the supported platforms. I'm hoping to get back to this soon. See "Testing and Continuous Integration" above.

## Binaries for macOS and Windows

I understand compilation is a barrier for users of macOS and Windows especially, and the old binary packages included more projects than just Framework Mono itself. I feel that it makes sense to wait until after we have CI though, as I'd prefer to have these packages built by CI. Packaging is also more complex than building and testing these projects.

## Remove Dependencies on Old Hosting

We still depend on mono-project.com and github.com/mono for a lot of things. I don't know how long those resources will continue to work, so I would like to mirror them and ensure that the Framework Mono codebase isn't using them.