Freigeben über


Erkennen von Paketidentität und Runtimekontext

Du besitzt unter Umständen einige Versionen der App, die nicht in einem MSIX-Paket verteilt wurden. Zur Laufzeit kann deine App erkennen, ob sie als MSIX-Paket bereitgestellt wurde, indem sie die Windows-Paket-Manager-API oder dein eigenes benutzerdefiniertes Installationsprogramm verwendet. Möglicherweise möchtest du das App-Verhalten (etwa Updateeinstellungen) ändern oder Funktionen nutzen, die nur für MSIX-Pakete verfügbar sind.

Um zu ermitteln, ob deine Anwendung als MSIX-Paket in einer Version von Windows ausgeführt wird, die den vollständigen MSIX-Funktionssatz unterstützt, kannst du die native Funktion GetCurrentPackageFullName in Kernel32.dll verwenden. Wenn eine Desktopanwendung als nicht gepackte Anwendung ohne Paketidentität ausgeführt wird, gibt diese Funktion einen Fehler zurück, mit dem Sie den Kontext ableiten können, in dem die App ausgeführt wird.

Wird die Funktion erfolgreich ausgeführt, bedeutet das Folgendes:

  • Deine App ist in einem MSIX-Paket verpackt.
  • Deine App wird unter Windows 10, Version 1709 (Build 16299) oder höher mit vollständiger MSIX-Unterstützung ausgeführt.

Verwenden von „GetCurrentPackageFullName“ in nativem Code

Im folgenden Codebeispiel wird veranschaulicht, wie mit GetCurrentPackageFullName der Kontext einer App ermittelt wird.

#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;
}

Verwenden der Funktion „GetCurrentPackageFullName“ in verwaltetem Code

Wenn du GetCurrentPackageFullName in einer verwalteten .NET Framework-App aufrufen möchtest, musst du den Plattformaufrufmechanismus (P/Invoke) oder eine andere Form der Interoperabilität verwenden.

Um diesen Prozess zu vereinfachen, kannst du die Bibliothek DesktopBridgeHelpers verwenden. Diese Bibliothek unterstützt .NET Framework 4 und höher. Sie verwendet „P/Invoke“ intern, um eine Hilfsklasse bereitzustellen, die bestimmt, ob die App unter einer Windows-Version ausgeführt wird, die den vollständigen MSIX-Funktionssatz unterstützt. Diese Bibliothek ist auch als NuGet-Paket verfügbar.

Nachdem du das Paket in deinem Projekt installiert hast, kannst du eine neue Instanz der DesktopBridge.Helpers-Klasse erstellen und die IsRunningAsUwp-Methode aufrufen. Diese Methode gibt „true“ zurück, wenn deine App als MSIX-Paket unter Windows 10, Version 1709 (Build 16299) oder höher ausgeführt wird, und „false“, wenn dies nicht zutrifft. Das folgende Beispiel veranschaulicht, wie diese Methode aufgerufen wird:

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";
   }
}