public static ProcessSerialNumber OpenApplication(ApplicationStartInfo application) { if (application == null) { throw new ArgumentNullException("application"); } if (string.IsNullOrEmpty(application.Application) || !System.IO.Directory.Exists(application.Application)) { throw new ArgumentException("Application is not valid"); } var appParams = new LSApplicationParameters(); if (application.NewInstance) { appParams.flags |= LSLaunchFlags.NewInstance; } if (application.Async) { appParams.flags |= LSLaunchFlags.Async; } NSArray argv = null; if (application.Args != null && application.Args.Length > 0) { var args = application.Args; NSObject[] arr = new NSObject[args.Length]; for (int i = 0; i < args.Length; i++) { arr[i] = new NSString(args[i]); } argv = NSArray.FromNSObjects(arr); appParams.argv = argv.Handle; } NSDictionary dict = null; if (application.Environment.Count > 0) { dict = new NSMutableDictionary(); foreach (var kvp in application.Environment) { dict.SetValueForKey(new NSString(kvp.Value), new NSString(kvp.Key)); } appParams.environment = dict.Handle; } var cfUrl = global::MonoMac.CoreFoundation.CFUrl.FromFile(application.Application); ProcessSerialNumber psn; try { appParams.application = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(FSRef))); if (!CoreFoundation.CFURLGetFSRef(cfUrl.Handle, appParams.application)) { throw new Exception("Could not create FSRef from CFUrl"); } var status = LSOpenApplication(ref appParams, out psn); if (status != OSStatus.Ok) { throw new Exception("Failed to start process: " + ((int)status).ToString()); } } finally { if (appParams.application != IntPtr.Zero) { Marshal.FreeHGlobal(appParams.application); } appParams.application = IntPtr.Zero; if (dict != null) { dict.Dispose(); //also ensures the NSDictionary is kept alive for the params } if (argv != null) { argv.Dispose(); //also ensures the NSArray is kept alive for the params } } return(psn); }