Ejemplo n.º 1
0
        private void ExecuteInstallAppx(ParameterHelper parameters, string appxFile, string certificate)
        {
            if (_verbose)
            {
                Console.Out.WriteLine("Starting Appx installation...");
            }

            var file = new FileInfo(Path.GetFullPath(appxFile));

            if (!file.Exists)
            {
                throw new System.IO.FileNotFoundException("Specified appx file '" + appxFile + "' wasn't found");
            }

            if (!String.IsNullOrWhiteSpace(certificate))
            {
                var certFile = new FileInfo(certificate);
                if (!certFile.Exists)
                {
                    throw new System.IO.FileNotFoundException("Specified certificate file '" + certFile + "' wasn't found");
                }
                certificate = certFile.FullName;
            }
            else
            {
                // Must pass in null instead of empty string if certificate is omitted
                certificate = null;
            }

            // Parse the AppxManfest contained in the Appx file to extract the package name, dependencies, AppID, etc.
            AppxManifest appxData;

            try
            {
                appxData = AppxManifest.Get(appxFile);
            }
            catch (Exception ex)
            {
                Console.Out.WriteLine("Failed to parse Appx manifest: " + ex.Message);
                throw;
            }
            if (!appxData.IsValid)
            {
                throw new System.ArgumentException("Specified Appx '" + appxFile + "' contains an invalid AppxManifest");
            }

            // Construct an "identity" object from the AppxManifest data which can be referenced later to launch the installed app
            var appIdentity = new AppPackageIdentity(appxData);

            // Query for app packages already installed on the device and uninstall them if necessary
            // NOTE: Check for any uninstall any package matching this appx PackageName and Publisher to
            //  ensure a clean install of the new build

            List <PackageInfo> matchingPackages;

            if (TryRetrieveInstalledPackages(appIdentity, out matchingPackages) && matchingPackages.Count() > 0)
            {
                if (_verbose)
                {
                    Console.Out.WriteLine("Uninstalling previous app..");
                }

                foreach (var package in matchingPackages)
                {
                    try
                    {
                        if (_verbose)
                        {
                            Console.Out.WriteLine("Uninstalling package: " + package.FullName);
                        }

                        _portal.UninstallApplicationAsync(package.FullName).Wait();
                    }
                    catch (AggregateException ex)
                    {
                        // NOTE: We really shouldn't continue with installation if we failed to remove a previous version of the app.
                        // If a version of the app remains on the device, the Install API will NOT replace it but still reports "success",
                        // meaning the user could be running old code and not know it. A hard fail is the only way to ensure this doesn't happen.
                        Console.Out.WriteLine("Uninstall of package '" + package.FullName + "' failed: " + ex.InnerException.Message);
                        System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
                    }
                }

                if (_verbose)
                {
                    Console.Out.WriteLine("Finished uninstalling previous app packages");
                }
            }

            Task installTask = _portal.InstallApplicationAsync(null, file.FullName, appxData.Dependencies, certificate, 500, 1, false);

            try
            {
                installTask.Wait();
                Console.Out.WriteLine("Installation completed successfully");
            }
            catch (AggregateException ex)
            {
                Console.Out.WriteLine("Installation of Appx failed!");

                HandleInstallOperationException(ex);
                System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
            }

            // Save AppIdentity to field after successful installation
            _installedAppId = appIdentity;

            // If the app Identity is "complete" we have the FullPackageName and AUMID parameters, so we'll
            // add them to our parameter set to later launch the app; no need to query package info from the device
            if (_installedAppId.CompleteIdentity)
            {
                parameters.AddOrUpdateParameter(parameterPackage, _installedAppId.PackageFullName);
                parameters.AddOrUpdateParameter(ParameterAumid, _installedAppId.LaunchId);
            }
        }
Ejemplo n.º 2
0
 public AppPackageIdentity(AppxManifest appxData)
 {
     InitializeInternal(appxData.PackageName, appxData.AppId, appxData.Publisher, appxData.Version, appxData.CpuArchitecture, appxData.ResourceId);
 }