internal static AppxIdentity GetIdentityFromPackageManifest(XDocument document, CancellationToken cancellationToken = default) { /* * <Package * xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"> * <Identity Name="MSIXHero" Version="2.0.46.0" Publisher="CN=abc" ProcessorArchitecture="neutral" /> */ XNamespace windows10Namespace = "http://schemas.microsoft.com/appx/manifest/foundation/windows10"; XNamespace appxNamespace = "http://schemas.microsoft.com/appx/2010/manifest"; var root = document.Element(windows10Namespace + "Package") ?? document.Element(appxNamespace + "Package"); if (root == null) { throw new InvalidDataException("Not a valid package manifest. Missing root element <Package />."); } var identity = root.Element(windows10Namespace + "Identity") ?? root.Element(appxNamespace + "Identity"); if (identity == null) { throw new InvalidDataException("Not a valid bundle manifest. Missing child element <Identity />."); } var version = identity.Attribute("Version"); var publisher = identity.Attribute("Publisher"); var name = identity.Attribute("Name"); var architecture = identity.Attribute("ProcessorArchitecture"); var appxIdentity = new AppxIdentity { Name = name?.Value, Publisher = publisher?.Value, Version = version?.Value }; if (architecture != null) { if (Enum.TryParse(architecture.Value, true, out AppxPackageArchitecture architectureValue)) { appxIdentity.Architectures = new[] { architectureValue }; } else { Logger.Warn("Could not parse the value " + architecture.Value + " to one of known enums."); } } return(appxIdentity); }
internal static AppxIdentity GetIdentityFromBundleManifest(XDocument document, CancellationToken cancellationToken = default) { /* *<?xml version="1.0" encoding="UTF-8"?> * <Bundle xmlns:b4="http://schemas.microsoft.com/appx/2018/bundle" xmlns="http://schemas.microsoft.com/appx/2013/bundle" */ XNamespace bundleManifest = "http://schemas.microsoft.com/appx/2013/bundle"; var root = document.Element(bundleManifest + "Bundle"); if (root == null) { throw new InvalidDataException("Not a valid bundle manifest. Missing root element <Bundle />."); } var identity = root.Element(bundleManifest + "Identity"); if (identity == null) { throw new InvalidDataException("Not a valid bundle manifest. Missing child element <Identity />."); } var version = identity.Attribute("Version"); var publisher = identity.Attribute("Publisher"); var name = identity.Attribute("Name"); var packagesNode = root.Element(bundleManifest + "Packages"); var packages = packagesNode?.Elements(bundleManifest + "Package"); var appxIdentity = new AppxIdentity { Name = name?.Value, Publisher = publisher?.Value, Version = version?.Value }; if (packages != null) { var architectures = new HashSet <AppxPackageArchitecture>(); foreach (var package in packages) { var architecture = package.Attribute("Architecture"); if (architecture == null) { continue; } if (Enum.TryParse(architecture.Value, true, out AppxPackageArchitecture architectureValue)) { architectures.Add(architectureValue); } else { Logger.Warn("Could not parse the value " + architecture.Value + " to one of known enums."); } } appxIdentity.Architectures = architectures.ToArray(); } return(appxIdentity); }