Praktyczny programista
Strona główna Programowanie Jak uruchomić aplikację zainstalowaną przez MSIX?

Jak uruchomić aplikację zainstalowaną przez MSIX?

przez Radek

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>

You may also like

1 komentarz

dotnetomaniak.pl 18 listopada 2021 - 09:15

Jak uruchomić aplikację zainstalowaną przez MSIX?

Dziękujemy za dodanie artykułu – Trackback z dotnetomaniak.pl

Odpowiedz

Skomentuj