|  | @@ -66,27 +66,53 @@ namespace Grpc.Tools
 | 
	
		
			
				|  |  |                  default: Cpu = CpuKind.Unknown; break;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  #else
 | 
	
		
			
				|  |  | -            // Running under either Mono or full MS framework.
 | 
	
		
			
				|  |  | -            Os = OsKind.Windows;
 | 
	
		
			
				|  |  | -            if (Type.GetType("Mono.Runtime", throwOnError: false) != null)
 | 
	
		
			
				|  |  | +            // Using the same best-effort detection logic as Grpc.Core/PlatformApis.cs
 | 
	
		
			
				|  |  | +            var platform = Environment.OSVersion.Platform;
 | 
	
		
			
				|  |  | +            if (platform == PlatformID.Win32NT || platform == PlatformID.Win32S || platform == PlatformID.Win32Windows)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                // Congratulations. We are running under Mono.
 | 
	
		
			
				|  |  | -                var plat = Environment.OSVersion.Platform;
 | 
	
		
			
				|  |  | -                if (plat == PlatformID.MacOSX)
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    Os = OsKind.MacOsX;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                else if (plat == PlatformID.Unix || (int)plat == 128)
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    // This is how Mono detects OSX internally.
 | 
	
		
			
				|  |  | -                    Os = File.Exists("/usr/lib/libc.dylib") ? OsKind.MacOsX : OsKind.Linux;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +                Os = OsKind.Windows;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            else if (platform == PlatformID.Unix && GetUname() == "Darwin")
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Os = OsKind.MacOsX;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            else
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Os = OsKind.Linux;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // Hope we are not building on ARM under Xamarin!
 | 
	
		
			
				|  |  |              Cpu = Environment.Is64BitProcess ? CpuKind.X64 : CpuKind.X86;
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [DllImport("libc")]
 | 
	
		
			
				|  |  | +        static extern int uname(IntPtr buf);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // This code is copied from Grpc.Core/PlatformApis.cs
 | 
	
		
			
				|  |  | +        static string GetUname()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var buffer = Marshal.AllocHGlobal(8192);
 | 
	
		
			
				|  |  | +            try
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                if (uname(buffer) == 0)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    return Marshal.PtrToStringAnsi(buffer);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                return string.Empty;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            catch
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return string.Empty;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            finally
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                if (buffer != IntPtr.Zero)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    Marshal.FreeHGlobal(buffer);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // Exception handling helpers.
 |