private static extern int GetPackageInfo(IntPtr packageInfoReference, PackageConstants flags, ref int bufferLength, IntPtr buffer, out int count);
private static IEnumerable <AppxPackage> QueryPackageInfo(string fullName, PackageConstants flags) { IntPtr infoRef; OpenPackageInfoByFullName(fullName, 0, out infoRef); if (infoRef != IntPtr.Zero) { IntPtr infoBuffer = IntPtr.Zero; try { int len = 0; int count; GetPackageInfo(infoRef, flags, ref len, IntPtr.Zero, out count); if (len > 0) { var factory = (IAppxFactory) new AppxFactory(); infoBuffer = Marshal.AllocHGlobal(len); int res = GetPackageInfo(infoRef, flags, ref len, infoBuffer, out count); for (int i = 0; i < count; i++) { var info = (PACKAGE_INFO)Marshal.PtrToStructure(infoBuffer + i * Marshal.SizeOf(typeof(PACKAGE_INFO)), typeof(PACKAGE_INFO)); var package = new AppxPackage(); package.FamilyName = Marshal.PtrToStringUni(info.packageFamilyName); package.FullName = Marshal.PtrToStringUni(info.packageFullName); package.Path = Marshal.PtrToStringUni(info.path); package.Publisher = Marshal.PtrToStringUni(info.packageId.publisher); package.PublisherId = Marshal.PtrToStringUni(info.packageId.publisherId); package.ResourceId = Marshal.PtrToStringUni(info.packageId.resourceId); package.ProcessorArchitecture = info.packageId.processorArchitecture; package.Version = new Version(info.packageId.VersionMajor, info.packageId.VersionMinor, info.packageId.VersionBuild, info.packageId.VersionRevision); // read manifest string manifestPath = System.IO.Path.Combine(package.Path, "AppXManifest.xml"); const int STGM_SHARE_DENY_NONE = 0x40; IStream strm; SHCreateStreamOnFileEx(manifestPath, STGM_SHARE_DENY_NONE, 0, false, IntPtr.Zero, out strm); if (strm != null) { var reader = factory.CreateManifestReader(strm); package._properties = reader.GetProperties(); package.Description = package.GetPropertyStringValue("Description"); package.DisplayName = package.GetPropertyStringValue("DisplayName"); package.Logo = package.GetPropertyStringValue("Logo"); package.PublisherDisplayName = package.GetPropertyStringValue("PublisherDisplayName"); package.IsFramework = package.GetPropertyBoolValue("Framework"); var apps = reader.GetApplications(); while (apps.GetHasCurrent()) { var app = apps.GetCurrent(); var appx = new AppxApp(app); appx.Description = GetStringValue(app, "Description"); appx.DisplayName = GetStringValue(app, "DisplayName"); appx.EntryPoint = GetStringValue(app, "EntryPoint"); appx.Executable = GetStringValue(app, "Executable"); appx.Id = GetStringValue(app, "Id"); appx.Logo = GetStringValue(app, "Logo"); appx.SmallLogo = GetStringValue(app, "SmallLogo"); appx.StartPage = GetStringValue(app, "StartPage"); appx.Square150x150Logo = GetStringValue(app, "Square150x150Logo"); appx.Square30x30Logo = GetStringValue(app, "Square30x30Logo"); appx.BackgroundColor = GetStringValue(app, "BackgroundColor"); appx.ForegroundText = GetStringValue(app, "ForegroundText"); appx.WideLogo = GetStringValue(app, "WideLogo"); appx.Wide310x310Logo = GetStringValue(app, "Wide310x310Logo"); appx.ShortName = GetStringValue(app, "ShortName"); appx.Square310x310Logo = GetStringValue(app, "Square310x310Logo"); appx.Square70x70Logo = GetStringValue(app, "Square70x70Logo"); appx.MinWidth = GetStringValue(app, "MinWidth"); package._apps.Add(appx); apps.MoveNext(); } Marshal.ReleaseComObject(strm); } yield return(package); } Marshal.ReleaseComObject(factory); } } finally { if (infoBuffer != IntPtr.Zero) { Marshal.FreeHGlobal(infoBuffer); } ClosePackageInfo(infoRef); } } }