When Microsoft originally released its .NET run-time and framework, programming for Windows became much easier. You got to choose from some favorite languages (C++, a Java-similar language called C# and Visual Basic), but by choosing .NET you were effectively locking yourself into the Windows platform. If you were thinking about portability, you had to look to such tools as C++ and wxWidgets.
That said, Microsoft did something right when it developed the .NET system. It devised a standard called the CLI (Common Language Infrastructure) that was accepted by both Ecma International and ISO (International Organization for Standardization). This allowed developers to create their own versions of .NET for other platforms, or even for Windows.
A few groups of developers have worked on implementing CLI for other platforms, but the one that has clearly taken the lead is the open-source Mono Project. Mono is now available on Windows, the various breeds of Linux and Solaris, and even on Mac OS X-which means that Windows developers can port their software to any of these platforms.
Porting is still not perfect, however, as Microsoft continues to barrel forward with new APIs and technologies under the .NET umbrella. If you have an existing .NET project, you very well may run into problems trying to run it under the Mono run-time. And, indeed, you can run your .NET software directly under Mono, as the binaries are compatible-assuming you haven't used any features not yet implemented under Mono.
That's where the MoMA (Mono Migration Analyzer) tool comes in. MoMA is available free of charge, as is the entire Mono project.