[Mono-dev] MSBuild file for .Net 1.0, 1.1, 2.0, Compact Framework 1.0 & 2.0 and Mono

Gustavo Guerra gmcg at acm.org
Tue Oct 18 14:00:55 EDT 2005

Forget ContinueOnErrorWhenBuildingForAllPlatforms, wasn't working after all.
Latest version at https://ovatsus.ath.cx/Ovatsus.CSharp.targets

"Gustavo Guerra" <gmcg at acm.org> wrote in message 
news:dj34bh$5h2$1 at sea.gmane.org...
> Greetings,
> Intro:
> I'm currently working in a library that has to target both .Net 2.0 and 
> .Net Compact Framework 2.0.
> My initial approach was to have two projects for each assembly. The source 
> code would be all the same, with #if's testing for the compact or the full 
> framework. One of the projects would have all the files, and the other all 
> the files from the first linked.
> As the number of source files and assemblies growed, this turned into 
> problematic.
> At some time, I also wanted to test if my code worked in mono, even if it 
> wasn't required.
> So I thought of using msbuild to customize my build. I started googling, 
> and found msbuild files from Jomo Fisher and Robert McLaws that would 
> target previous versions of .Net. And I also found msbuild files from Mike 
> Hull and Andy Waddell that would target Mono. But nothing to target 
> Compact Framework
> So, a week's work of researching the docs, posting on miscrosoft msbuild 
> forum and other newsgroups, and I've come up with a msbuild file that does 
> all that I wanted.
> I'm sharing it here so everyone can use it and also to get improvements 
> for it.
> The file is called Ovatsus.CSharp.targets and is attached in this message
> Usage Instructions:
> -Copy the Ovatsus.CSharp.targets to C:\Program Files\MSBuild
> -Replace the <Import> element from your project file with <Import 
> Project="$(MSBuildExtensionsPath)\Ovatsus.CSharp.targets"/>
> After that you have 11 new Platforms:
> .NET 1.0
> .NET 1.1
> .NET 2.0
> .NET CF 1.0 (Pocket PC 2003)
> .NET CF 1.0 (Smartphone 2003)
> .NET CF 2.0 (Pocket PC 2003)
> .NET CF 2.0 (Windows CE 5.0)
> .NET 1.1 (Mono Compiler & Libraries)
> .NET 2.0 (Mono Compiler & Libraries)
> .NET 1.1 (Mono Libraries)
> .NET 2.0 (Mono Libraries)
> The existing Any CPU platform remains, and if you build with that platform 
> selected you will build for all targets sequentially. It continues to be 
> the default platform so if you just invoke msbuild.exe from the project 
> directory, you'll build everything.
> The difference between the "Mono Libraries" platforms and "Mono Compiler & 
> Libraries" platforms is that in the first, the compiler is still csc and 
> not the mono mcs or gmcs. These targets exists so you can debug inside VS.
> There are also defined some conditional compilation symbols. They are, 
> respectively for the above platforms:
> NET_1_0
> NET_1_1
> NET_2_0
> NET_CF;NET_CF_1_0;PocketPC
> NET_CF;NET_CF_1_0;Smartphone
> NET_CF;NET_CF_2_0;PocketPC
> NET_CF;NET_CF_2_0;WindowsCE
> NET_1_1;Mono
> NET_2_0;Mono
> NET_1_1;Mono
> NET_2_0;Mono
> All works fine from msbuild.exe. From withing VS there are a few things 
> worth notice:
> 1-You can't deploy to the compact framework, and you can design cf forms 
> visually, but VS won't know your form is for the CF, and will probably set 
> properties that don't exist in CF. You can always create a specific CF 
> project, that just uses all code, including forms, from the multi-platform 
> project
> 2-If you have project references, VS will only find the referenced project 
> assemblies if you set both projects to the same Platform, and that 
> platform can't be AnyCPU. What you can do is build for all platforms in 
> the referenced project, unload it and then build for any platform you like 
> (including all at once - AnyCPU) in the referencee project. In this case 
> VS will work correctly. Note that from msbuild.exe it all works correctly.
> Also, you can override the platform names before including 
> Ovatsus.CSharp.targets by overriding the following properties:
> NET_1_0
> NET_1_1
> NET_2_0
> NET_CF_1_0_PocketPC
> NET_CF_1_0_Smartphone
> NET_CF_2_0_PocketPC
> NET_CF_2_0_WinCE
> Mono_1_1_Full
> Mono_2_0_Full
> Mono_1_1_LibOnly
> Mono_2_0_LibOnly
> You can also change the conditional compilation symbols, by overriding 
> these properties:
> NET_1_0_Constant
> NET_1_1_Constant
> NET_2_0_Constant
> NET_CF_1_0_Constant
> NET_CF_2_0_Constant
> NET_CF_Constant
> Mono_Constant
> I don't suport overriding the symbols PocketPC, Smartphone or WindowCE, 
> because these names already existed in VS when building for CF.
> You can also override these two properties:
> BinDir
> ObjDir
> By default, they are setted to bin and obj, respectively. You can override 
> them to something else, if you want. This is usefull if you have the 
> source code in cvs or svn, for example, and don't want to have to mess 
> with settings the ignore directories. In that case, you can set those 
> properties to ..\..\bin and ..\..\obj, for example, so it's out of your 
> working copy. When building inside VS, it will stubbornly create the obj 
> directories below your project directory, but as it only contains more 
> empty subdirectories, that's less of a problem.
> You can also override the property MonoPath, that's hardcoded to 
> C:\Program Files\Mono-, or set an environment variable with that 
> name. Please don't surround it with ".
> At last, you can also override the property 
> ContinueOnErrorWhenBuildingForAllPlatforms, that defaults to false.
> Best regards,
> Gustavo Guerra

More information about the Mono-devel-list mailing list