Hello, The original frameworks (both 1.0 and 1.1) didn't have a value to identity Unix (and Unix-like) operating systems. Mono has been using the value 128 up to now to identity them.
The framework v2.0 introduce a new Unix enum value (4) in PlatformID, but this isn't compatible with the existing Mono value [1]. As you can guess this is a "breaking change" for Mono. So the default Mono profile, corresponding to Fx 1.1, will still continue to use the 128 value (for compatibility with existing code). However the newer 2.0 profile has started (it's in SVN but it wasn't in 1.1.7) to use the new Unix (4) value. There are a few ways for applications to deal with this: 1. You can use a compiler define to deal with 1.1/2.0 differences. Some code already have to deal with this (so it's no big deal), e.g. this is what you'll see in the class libraries (except for corlib) and the unit tests. using System; class Program { static void Main () { #if NET_2_0 if (Environment.OSVersion.Platform == PlatformID.Unix) { #else if ((int) Environment.OSVersion.Platform == 128) { #endif Console.WriteLine ("Running on Unix"); } else { Console.WriteLine ("NOT running on Unix"); } } } % mcs test1.cs /d:NET_1_1 % mono test1.exe Running on Unix % gmcs test1.cs /d:NET_2_0 % mono test1.exe Running on Unix Note: inside mscorlib.dll we can use the internal Environment.IsRunningOnWindows to shield us from the difference. 2. Lots of existing code don't care about the framework version. In that case it's easier to use code that will work on both versions, like: using System; class Program { static void Main () { int p = (int) Environment.OSVersion.Platform; if ((p == 4) || (p == 128)) { Console.WriteLine ("Running on Unix"); } else { Console.WriteLine ("NOT running on Unix"); } } } % mcs test2.cs % mono test2.exe Running on Unix % gmcs test2.cs % mono test2.exe Running on Unix 3. If your code can only be compiled with 2.0 (e.g. it use generics) then you can use the new enum value Unix (4) and forget about the old value. using System; class Program { static void Main () { // this will only work with 2.0 (for both Mono and MS) if (Environment.OSVersion.Platform == PlatformID.Unix) { Console.WriteLine ("Running on Unix"); } else { Console.WriteLine ("NOT running on Unix"); } } } % gmcs test3.cs % mono test3.exe Running on Unix ... but this won't work if you try to compile it with MCS ... mcs test3.cs test3.cs(15) error CS0117: `System.PlatformID' does not contain a definition for `Unix' Compilation failed: 1 error(s), 0 warnings ... or CSC versions earlier than 8.0.* [1] http://bugzilla.ximian.com/show_bug.cgi?id=74841 -- Sebastien Pouliot <[EMAIL PROTECTED]> blog: http://pages.infinit.net/ctech/poupou.html _______________________________________________ Mono-devel-list mailing list Mono-devel-list@lists.ximian.com http://lists.ximian.com/mailman/listinfo/mono-devel-list