Udostępnij przez


Wykrywanie tożsamości pakietu i kontekstu środowiska uruchomieniowego

Być może masz niektóre wersje aplikacji, które nie zostały rozproszone w pakiecie MSIX. W czasie wykonywania aplikacja może wykryć, czy została wdrożona jako pakiet MSIX przy użyciu interfejsu API Menedżera pakietów systemu Windows, czy własnego instalatora niestandardowego. Możesz zmienić zachowanie aplikacji, takie jak ustawienia aktualizacji, lub skorzystać z funkcji dostępnych tylko dla pakietów MSIX.

Aby określić, czy aplikacja jest uruchomiona jako pakiet MSIX w wersji systemu Windows obsługującej pełny zestaw funkcji MSIX, możesz użyć funkcji natywnej GetCurrentPackageFullName w kernel32.dll. Gdy aplikacja klasyczna jest uruchomiona jako rozpakowana aplikacja bez tożsamości pakietu, ta funkcja zwraca błąd, który może pomóc w wywnioskowaniu kontekstu, w którym aplikacja działa.

Jeśli funkcja powiedzie się, oznacza to:

  • Aplikacja jest spakowana w pakiecie MSIX.
  • Aplikacja jest uruchomiona w systemie Windows 10 w wersji 1709 (kompilacja 16299) lub nowszej z pełną obsługą MSIX.

Używanie funkcji GetCurrentPackageFullName w kodzie natywnym

W poniższym przykładzie kodu pokazano, jak za pomocą polecenia GetCurrentPackageFullName określić kontekst aplikacji.

#define _UNICODE 1
#define UNICODE 1

#include <Windows.h>
#include <appmodel.h>
#include <malloc.h>
#include <stdio.h>

int __cdecl wmain()
{
    UINT32 length = 0;
    LONG rc = GetCurrentPackageFullName(&length, NULL);
    if (rc != ERROR_INSUFFICIENT_BUFFER)
    {
        if (rc == APPMODEL_ERROR_NO_PACKAGE)
            wprintf(L"Process has no package identity\n");
        else
            wprintf(L"Error %d in GetCurrentPackageFullName\n", rc);
        return 1;
    }

    PWSTR fullName = (PWSTR) malloc(length * sizeof(*fullName));
    if (fullName == NULL)
    {
        wprintf(L"Error allocating memory\n");
        return 2;
    }

    rc = GetCurrentPackageFullName(&length, fullName);
    if (rc != ERROR_SUCCESS)
    {
        wprintf(L"Error %d retrieving PackageFullName\n", rc);
        return 3;
    }
    wprintf(L"%s\n", fullName);

    free(fullName);

    return 0;
}

Używanie funkcji GetCurrentPackageFullName w kodzie zarządzanym

Aby wywołać GetCurrentPackageFullName w zarządzanej aplikacji .NET Framework, musisz użyć funkcji Platform Invoke (P/Invoke) lub innej formy współdziałania.

Aby uprościć ten proces, możesz użyć biblioteki DesktopBridgeHelpers . Ta biblioteka obsługuje program .NET Framework 4 lub nowszy i używa wewnętrznie P/Invoke do udostępnienia klasy pomocniczej, która określa, czy aplikacja jest uruchomiona w wersji systemu Windows obsługującej pełny zestaw funkcji MSIX. Ta biblioteka jest również dostępna jako pakiet NuGet.

Po zainstalowaniu pakietu w projekcie można utworzyć nowe wystąpienie DesktopBridge.Helpers klasy i wywołać metodę IsRunningAsUwp . Ta metoda zwraca wartość true, jeśli aplikacja jest uruchomiona jako pakiet MSIX w systemie Windows 10, wersja 1709 (kompilacja 16299) lub nowsza i fałsz, jeśli którakolwiek z nich nie jest prawdziwa. W poniższym przykładzie pokazano, jak wywołać tę metodę.

private bool IsRunningAsUwp()
{
   UwpHelpers helpers = new UwpHelpers();
   return helpers.IsRunningAsUwp();
}

private void Form1_Load(object sender, EventArgs e)
{
   if (IsRunningAsUwp())
   {
       txtUwp.Text = "I'm running as MSIX";
   }
   else
   {
       txtUwp.Text = "I'm running as a native desktop app";
   }
}