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; }
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); }
static extern OSStatus LSOpenApplication (ref LSApplicationParameters appParams, out ProcessSerialNumber psn);
static extern OSStatus LSOpenApplication(ref LSApplicationParameters appParams, out ProcessSerialNumber psn);