+Q: Why support Windows, when you can run the real thing?
+
+A: There are various reasons:
+
+ <ul>
+ <li> About half the contributors to Mono are Windows developers.
+ They have many different for contributing to the effort, and
+ we find it very important to let those developers run the runtime on Windows without forcing
+ them to use a new operating system.
+
+ <li> Supporting Windows helps us identify the portable portions
+ of Mono from the non-portable versions of it, helping Mono
+ become more portable in the future.
+
+ <li> Mono does not heavily modify the windows registry, update system DLLs,
+ install DLLs to the Windows/System32 path. Another words, I knew Mono would
+ not cause any legacy enterprise applications to stop working - and it
+ hasn't. However, our CIO er is againt it because of the changes that would
+ be made to Windows 2000, such as, affecting security.
+ </ul>
+
+<a name="compatibility"></a>
+** Compatibility
+
+Q: Can Mono run applications developed with the Microsoft.NET framework?
+
+A: Yes, Mono can run applications developed with the Microsoft .NET Framework
+ on Unix. There are a few caveats to keep in mind: Mono has not
+ been completed yet, so a few API calls might be missing; And in
+ some cases the Mono behavior *might* be incorrect.
+
+Q: Will missing API entry points be implemented?
+
+A: Yes, the goal of Mono is to implement precisely the .NET Framework
+ API (as well as compile-time selectable subsets, for those
+ interested in a lighter version of Mono).
+
+Q: If the behavior of an API call is different, will you fix it?
+
+A: Yes, we will. But we will need your assistance for this. If you find a bug
+ in the Mono implementation, please fill a bug report in <a
+ href="http://bugzilla.ximian.com">http://bugzilla.ximian.com</a>.
+ Do not assume we know about the problem, we might not, and using the bug tracking
+ system helps us organize the development process.
+
+Q: Can I develop my applications on Windows, and deploy on a supported
+ Mono platform (like Linux)?
+
+A: Yes, you can.
+
+ As of today, Mono is not 100% finished, so it is sometimes useful
+ to compile the code with Mono, to find out if your application
+ depends on unimplemented functionality.
+
+Q: Will applications run out the box with Mono?
+
+A: Sometimes they will. But sometimes a .NET application might invoke
+ Win32 API calls, or assume certain patterns that are not correct
+ for cross-platform applications.
+
+Q: What is a 100% .NET application?
+
+A: A `100% .NET application' is one that only uses the APIs defined
+ under the System namespace and does not use P/Invoke. These
+ applications would in theory run unmodified on Windows, Linux,
+ HP-UX, Solaris, MacOS X and others.
+
+ Note that this requirement also holds for all assemblies used by the
+ application. If one of them is Windows-specific, then the entire program
+ is not a 100% .NET application.
+
+ Furthermore, a 100% .NET application must not contain non-standard data
+ streams in the assembly. For example, Visual Studio .NET will insert a
+ <tt>#-</tt> stream into assemblies built under the "Debug" target.
+ This stream contains debugging information for use by Visual Studio .NET;
+ however, this stream can not be interpreted by Mono (unless you're willing
+ to donate support).
+
+ Thus, it is recommended that all Visual Studio .NET-compiled code be
+ compiled under the Release target before it is executed under Mono.
+
+Q: Can I execute my Visual Studio .NET program (Visual Basic .NET, Visual C#,
+ Managed Extensions for C++, etc.) under Mono?
+
+A: Yes, with some reservations.
+
+ The .NET program must either be a 100% .NET application, or (somehow) have
+ all dependent assemblies available on all desired platforms. (How to do so
+ is outside the bounds of this FAQ.)
+
+ Mono must also have an implementation for the .NET assemblies used. For
+ example the System.EnterpriseServices namespace is part of .NET, but it
+ has not been implemented in Mono. Thus, any applications using this
+ namespace will not run under Mono.
+
+ With regards to languages, C# applications tend to be most portable.
+
+ Visual Basic .NET applications are portable, but Mono's
+ Microsoft.VisualBasic.dll implementation is incomplete. It is recommended
+ to either avoid using this assembly in your own code, only use the
+ portions that Mono has implemented, or to help implement the missing
+ features. Additionally, you can set 'Option Strict On', which
+ eliminates the implicit calls to the unimplemented
+ Microsoft.VisualBasic.CompilerServices.ObjectType class.
+ (Thanks to Jörg Rosenkranz.)
+
+ Managed Extensions for C++ is least likely to operate under Mono. Mono
+ does not support mixed mode assemblies (that is, assemblies containing both
+ managed and unmanaged code, which Managed C++ can produce). You need a
+ fully-managed assembly to run under Mono, and getting the Visual C++ .NET
+ compiler to generate such an executable can be difficult. You need to use
+ only the .NET-framework assemblies, not the C libraries (you can't use
+ <b>printf</b>(3) for example.), and you need to use
+ the linker options <tt>/nodefaultlib /entry:main mscoree.lib</tt> in
+ addition to the <tt>/clr</tt> compiler flag. You can still use certain
+ compiler intrinsic functions (such as <b>memcpy</b>(3)) and the STL.
+ You should also see <a
+ href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmex/html/vcgrfconvertingmanagedextensionsforcprojectsfrommixed-modetopureil.asp"
+ >Converting Managed Extensions for C++ Projects from Mixed Mode to Pure
+ Intermediate Language</a> at MSDN.
+ Finally, you can use PEVERIFY.EXE from the .NET SDK to determine if the
+ assembly is fully managed.
+
+ Thanks to Serge Chaban for the linker flags to use.