What is .NET for?
.NET grew directly out of the Java wars. Java was the "write once, run anywhere" solution to the problem of interoperability. It didn't matter what the underlying operating system was. Java was platform independent and the perfect tool for cross-platform web-based development. The virtual machine (JVM) on each machine took care of API translation.
Microsoft saw Netscape and Java as the middleware threat to its hegemony on the desktop, and released an 'extended' version of the JVM for Windows, which resulted in the writing of Java apps that would work on Windows but not on other platforms, in Internet Explorer but not in Netscape. Such proprietary extensions were, by definition, antipathetic to the purpose of Java, and were designed to undermine Java's effectiveness as a cross-platform tool.
Sun Microsystems initiated a lawsuit in 1997, alleging that Microsoft had used its monopoly to subvert the principles of Java, and the issue became part of the anti-trust case against Microsoft, and is quoted in the Memorandum of the United States in support of motion for preliminary injunction, where it is stated that "Microsoft feared and sought to impede the development of network effects that cross-platform technology like Netscape Navigator and Java might enjoy and use to challenge Microsoft's monopoly. Another internal Microsoft document indicates that the plan was not simply to blunt Java/browser cross-platform momentum, but to destroy the cross-platform threat entirely, with the 'Strategic Objective' described as to 'Kill cross-platform Java by grow(ing) the polluted Java market.'"
Microsoft lost the case against Sun, and .NET emerged as Microsoft's response to Java, a middleware platform that mimicked many of the best features of Java, and could be used to generate Web Services. The singular difference was that .NET was multi-lingual, but not platform independent. C# was the Java clone formerly known as Cool. Visual Studio was re branded Visual Studio.NET, and the languages would compile to a Common Language Runtime (CLR), that was intended to be language- (rather than platform-) independent. .NET has many nice features, not least the multi-lingual runtime, but its commercial purpose was to supplant Java in the growing market for Web Services.
What is Mono for?
Mono has been presented as an interoperability tool, as a means of making it easier to migrate applications from Windows to Linux, or as a route by which .NET developers can jump from Windows to Linux without ever leaving their comfort zone, but de Icaza's original vision was both more simple and more complicated than that.
de Icaza saw Mono and .NET as a continuation of the philosophy that underpinned technologies such as ANDF (the Architecture Neutral Distribution Format), originally developed by the UK Royal Signals Research Establishment.
ANDF was intended to be a binary standard format for Unix applications, something like an internal state table, consistent with the last stage of compilation before the compiler actually turns the code into machine code. Applications would be distributed in ANDF format, and the ANDF translator on the host machine would turn ANDF code into native code. The ANDF translator can be thought of as a virtual machine and the translation process roughly equivalent to just-in-time compilation. .NET, and more specifically, Mono, can be seen as a re-implementation of the principles behind ANDF, providing an intermediate translator for the implementation of applications with multi-language support.
The original objective of Mono was not so much to achieve compatibility with Microsoft as to enable faster development of distribution and language neutral Linux desktop applications. Seen in this way, Mono and the implementation of .NET technologies become a means to an end. de Icaza's argument was that Mono, the Common Language Runtime, and the .NET framework were "the fastest way we can get stuff out there."
From this perspective, the ability to run .NET applications written on Windows was an incidental bonus rather than the objective. "I've written my last C++ garbage collector. I want to write lots and lots of desktop applications and I want to write them fast. This framework is the quickest way of doing that." To this end the Gtk# bindings were included early, and a platform for writing GNOME apps took precedence over emulation or support for Windows compatibility.