Détecter l’identité d’un package et le contexte d’exécution
Certaines versions de votre application n'ont peut-être pas été distribuées dans un package MSIX. Au moment de l'exécution, votre application peut déterminer si elle a été déployée en tant que package MSIX à l'aide de l'API Gestionnaire de packages Windows ou de votre propre programme d'installation personnalisé. Vous pouvez modifier le comportement de l'application, comme les paramètres de mise à jour, ou tirer parti des fonctionnalités réservées aux packages MSIX.
Pour déterminer si votre application s'exécute en tant que package MSIX sur une version de Windows qui prend en charge l'ensemble des fonctionnalités MSIX, vous pouvez utiliser la fonction native GetCurrentPackageFullName dans kernel32.dll. Quand une application de bureau s’exécute en tant qu’application non empaquetée sans identité de package, cette fonction retourne une erreur qui peut vous aider à déduire le contexte dans lequel l’application s’exécute.
Si la fonction aboutit, cela signifie que :
- Votre application est empaquetée dans un package MSIX.
- Votre application s'exécute sous Windows 10, version 1709 (build 16299) ou version ultérieure, avec prise en charge complète de MSIX.
Utiliser GetCurrentPackageFullName dans le code natif
L'exemple de code suivant montre comment utiliser GetCurrentPackageFullName pour déterminer le contexte d'une application.
#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;
}
Utiliser la fonction GetCurrentPackageFullName dans du code managé
Pour appeler GetCurrentPackageFullName dans une application .NET Framework gérée, vous devez utiliser un appel de code non managé (P/Invoke) ou une autre forme d'interopérabilité.
Pour simplifier ce processus, vous pouvez utiliser la bibliothèque DesktopBridgeHelpers. Cette bibliothèque prend en charge .NET Framework 4 et versions ultérieures, et utilise P/Invoke en interne pour fournir une classe d'assistance qui détermine si l'application s'exécute sur une version de Windows qui prend en charge l'ensemble des fonctionnalités MSIX. Cette bibliothèque est également disponible sous forme de package NuGet.
Après avoir installé le package dans votre projet, vous pouvez créer une nouvelle instance de la classe DesktopBridge.Helpers
et appeler la méthode IsRunningAsUwp
. Cette méthode renvoie true si votre application s'exécute en tant que package MSIX sous Windows 10, version 1709 (build 16299) ou version ultérieure. Sinon, elle renvoie false. L'exemple qui suit montre comment appeler cette méthode.
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";
}
}