Still, wide adoption has been an uphill battle. While Mono-based applications ship as standard components of Novell's Suse Linux desktop, leading Linux vendor Red Hat never warmed to the platform, claiming Mono makes it easier to transfer technology from Linux to Windows than the other way around. Red Hat endorses Java-based development via its JBoss application server and related technologies, and it recently announced a Java-like language of its own, called Ceylon.
The critics' skepticism isn't completely unfounded, either. Microsoft's Community Promise does not extend to some key .Net frameworks, including the ADO.Net database abstraction layer, the ASP.Net Web framework, and Windows Forms. The Mono versions of those frameworks could still be sunk by submarine patents. If that happened, any applications developed using them would effectively revert to being Windows-only software.
Mono deserves a second look
But to dismiss Mono because of potential problems with Windows Forms is failing to see the forest for the trees. In recent years, Mono has grown to be much more than a way to do Windows-style development on alternative operating systems. For one thing, Mono bindings are available for the GTK+ and Qt GUI toolkits, so if you want to ditch Windows Forms altogether and write Linux-centric software with Mono, you're free to do so.
More important, Mono has become a valuable tool for cross-platform development across a wide range of operating systems and devices. For example, Novell's MonoTouch and Mono for Android are commercial products that allow developers to use C# and other .Net technologies to write apps for iOS and Android devices, respectively. Similarly, Unity Technologies offers a cross-platform game development tool that uses Mono as an intermediary layer, allowing developers to target PCs, iOS devices, Android devices, Xbox 360s, PlayStation 3s, and Web players with a minimum of recoding.
Let's not ignore the other advantage of Mono, which is the C# language itself. Although often dismissed as "Microsoft's Java clone," C# improved on Java in various ways, including better support for functional programming and parallelism, as well as various syntactic tweaks aimed at shedding some of the baggage Java has carried since its earliest days. Java is still playing catch-up to C# in some respects. Furthermore, Mono developers are free to code in any other CLI syntax, too, meaning they can target the platform using such diverse languages as Lisp, Python, Ruby, and even Fortran.