W świecie aplikacji desktopowych Windows popularnym sposobem na instalowanie programów było tworzenie instalatorów MSI/EXE.
W 2019 roku Microsoft wprowadził nowy format paczek instalacyjnych – MSIX.
Aplikacja, nad którą pracuję używa zewnętrznej aplikacji do wykonywania transformacji na plikach XML.
Do tej pory użytkownik wybierał w lokalizację pliku exe, który nastepnie był uruchamiany poprzez metodę Process.Start.
Zmiana ścieżki instalacji
Niestety, program zainstalowany w nowy sposób nie posiada jednoznacznej ścieżki instalacji.
Przykładowo MS Paint, w zależności od wersji może być zainstalowany w folderze:
C:\Program Files\WindowsApps\Microsoft.MSPaint_6.2105.4017.0_x64__8wekyb3d8bbwe
Użytkownik nie będzie w stanie łatwo znaleźć takiego folderu, szczególnie, że po aktualizacji aplikacji folder się zmieni.
PackageManager
Rozwiązaniem tej sytuacji jest skorzystanie z Windows.Management.Deployment.PackageManager.
var packageManager = new PackageManager(); var paintPackage = packageManager.FindPackagesForUser("") //pusty string oznacza, że zostaną wyszukana paczki dla aktualnie zalogowanego użytkownika .FirstOrDefault(x => x.Id.Name.Contains("Paint")); if (paintPackage?.Id == null) return; Console.WriteLine($"{paintPackage.Id.Name}: {paintPackage.Id.Version.Major}.{paintPackage.Id.Version.Minor}.{paintPackage.Id.Version.Build}.{paintPackage.Id.Version.Revision}");
W moim przypadku powyższy kod wyświetlił:
Microsoft.MSPaint: 6.2105.4017.0
Aby uruchomić Paint 3D, można użyć poniższy kod:
public async Task<bool> LaunchFirstApp(Package package) { var apps = await package.GetAppListEntriesAsync(); var firstApp = apps.FirstOrDefault(); if (firstApp == null) return false; return await firstApp.LaunchAsync(); }
App Execution Alias
Paczka instalacyjna może zawierać kilka aplikacji, dodatkowo każda z aplikacji może mieć zdefiniowane aliasy (umożliwiające uruchamianie dodatkowych tool’i z katalogu tej aplikacji).

Jeżeli nie chcemy uruchomić głównej aplikacji tylko jeden z jej aliasów, problemem może być nieznajomość nazwy aliasu. Oczywiście można odczytać nazwę z powyższego okna i „zahardkodować” tak używać jej w kodzie.
W moim przypadku, nazwa aliasu się zmieniała w zależności od typu aplikacji np. „alias-beta.exe”, „alias-rc.exe” aż do „alias.exe”.
Jedynym właściwym sposobem na odczytanie aliasu było odczytanie go z danych paczki MSIX.
W tym przypadku niestety nie udało mi się już znaleźć biblioteki, która umożliwia pobranie nazw aliasów dla aplikacji.
AppxManifest
Jedynym sposobem na odczytanie aliasów (oraz wszyskich innych danych paczki) jest odczytanie manifestu paczki, który jest plikiem w formacie XML.
Plik ten możemy odczytać następująco:
public static async Task<string> GetAppManifest(Package package) { var file = await package.InstalledLocation.GetFileAsync("AppxManifest.xml"); return await FileIO.ReadTextAsync(file); }
Przykładowa definicja aliasu w pliku „AppManifest” dla aplikacji „Windows Package Manager Client”:
<Application Id="winget" Executable="AppInstallerCLI.exe" EntryPoint="Windows.FullTrustApplication"> <uap:VisualElements DisplayName="Windows Package Manager Client" Square150x150Logo="Assets\AppPackageMedTile.png" Square44x44Logo="Assets\AppPackageAppList.png" Description="ms-resource:appDescription" BackgroundColor="#0078d7" AppListEntry="none"/> <Extensions> <uap3:Extension Category="windows.appExecutionAlias"> <uap3:AppExecutionAlias> <desktop:ExecutionAlias Alias="winget.exe"/> </uap3:AppExecutionAlias> </uap3:Extension> </Extensions> </Application>
1 komentarz
Jak uruchomić aplikację zainstalowaną przez MSIX?
Dziękujemy za dodanie artykułu – Trackback z dotnetomaniak.pl
Komentowanie zamknięte.