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); } }
public AppPackageIdentity(AppxManifest appxData) { InitializeInternal(appxData.PackageName, appxData.AppId, appxData.Publisher, appxData.Version, appxData.CpuArchitecture, appxData.ResourceId); }