tags:

views:

364

answers:

5

What are the best practices for writing code that can be cross compiled on .NET (windows) and Mono (linux)? Although I am very familiar with .NET, I am not that experienced in Mono and all its gotchas. Has anyone seen a good blog post or best practices paper on this, which I have not been able to dig up? I would be sticking with C# 3.0 level features.

Things that concern me is first of all Interop, since I would need to call some native code. Next would be the best ways to handle namespaces such as Mono.XXX. Should I be using a bunch of #if? Isolate the code in per-platform assemblies?

Any suggestions regarding architecture and design would be greatly appreciated! If you have had any experience in cross compiling for Linux/Mono in visual studio (any version), I would also be interested in that.

+2  A: 

Check out The Mono Migration Analyzer

Thanks. Since this would be new code, I am not sure if I would make use of this tool (unless I'm missing something?). In other words I plan to use CI to built both the windows a linux builds.
Will I Am
There are some parts of Mono that are not finished. For example few things in cryptography are missing. Those methods/classes are marked with 'todo' attributes. Moma will point out those not-implemented things to you.
+6  A: 

The biggest issues are sticking to the Mono-supported APIs. Using the Visual Studio Integration support in Mono can help a lot with this, since you can target Mono the entire time, on all platforms.

For your specific questions:

1) Interop - You'll need to stick to P/Invoke. Try to isolate this into separate, platform specific assemblies. This leads to 2:

2) Using #if - I would avoid this, and prefer to use an extensibility model. Mono supports the Managed Extensibility Framework, which provides a good way to "plug in" platform specific code at runtime.

Reed Copsey
Thanks for the pointer to the extensibility model. It shows it's a preview, not a shipping product. What are the chances the .net and mono implementations are going to stay in sync before the product is finalized?The visual studio integration plugin will definitely help, thank you.
Will I Am
MEF is open source, so I wouldn't worry about it too much. It's going to be part of .NET 4, and it's pretty much stable at this point. We use it in our commercial product already.
Reed Copsey
+1  A: 

The Mono project provides a document with portability guidelines. That is a pretty good place to start.

Stewart
If is worth noting that this document seems a little out-dated in places. That doesn't mean it is not full of useful information.
Stewart
A: 

You should be interrested by Prebuild :

Prebuild is a cross-platform XML-driven pre-build tool which allows developers to easily generate project files for major IDE's and .NET development tools including: Visual Studio .NET 2002, 2003, 2005, SharpDevelop, MonoDevelop, NAnt and Autotools.

controlbreak
Why the down vote ? The Prebuid project is very handy to maintain the same codebase using both .NET and Mono platform. And it's free.
controlbreak