Exemplo n.º 1
0
        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);
        }